“类MainForm可以进行设计,但不是文件中的第一个类”

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/acoolgiser/article/details/80846096

错误分析:

C#允许在某命名空间下的一个代码文件中定义多个类,比如在一个主窗体MainForm的cs文件中除了定义窗体本身的类外,还可以定义全局变量的类,如下:

    public class PublicValue
    {
        public static List<string> mainlist = new List<string>();
    }
这样的一个类中的变量就是全局变量,可以在该命名空间下的任何窗体和类中访问,访问方式为通过“.”运算符:
PublicValue.mainlist

但是这个类只能放在主窗体类的后面定义。

对于有设计器的控件都要求控件所在的类是排在第一个。主窗体中有控件。

解决办法:

把主窗体的类的定义代码public partial class MainForm :Form放在最前面,其余类的定义放在后面。

展开阅读全文

一时兴起,编了一个类可以进行集合运算

11-03

一时兴起,编了一个类,可以进行集合运算,rn把集合封装成类CJiHe,类的函数完成交集、并集、差集等运算。rnrn“集合”是一个很广的数学概念,数学中对它的研究非常多,rn但是我这次主要是练习编程,而不是去研究集合,rn所以我找了一个简单的集合:小写字母集,集合的元素是小写字母。rnrn因为集合本身有“不重复”的特性,所以最多只有26个成员,rn集合本身也有“无顺序”特性,所以对元素没有排序要求。rn至于集合的运算,因为使用最简单的莫过于+、-、*之类的了,rn所以我的程序主要进行了运算符重载。rn这样虽然编程比较复杂,但是应用中却不用记忆函数名了。rnrnrn//----------JiHe.h----------已略去不重要的内容----------rnclass CJiHernrnpublic:rn CJiHe(void);//创建空的集合rn virtual ~CJiHe();rn CJiHe(const char *str);//从字符串创建,自动去除非法字符与重复字符rn CJiHe(const CJiHe &other);//拷贝构造rnrn CJiHe &operator = (const CJiHe &other);//赋值号重载rn CJiHe &operator = (const char *str);//赋值号重载,从字符串赋值rnrn CJiHe operator + (const CJiHe &other) const;//加法重载,并集rn CJiHe operator - (const CJiHe &other) const;//减法重载,差集rn CJiHe operator * (const CJiHe &other) const;//乘法重载,交集rn CJiHe &operator += (const CJiHe &other);//+=重载,并集rn CJiHe &operator -= (const CJiHe &other);//-=重载,差集rn CJiHe &operator *= (const CJiHe &other);//*=重载,交集rnrn CJiHe operator + (const char c) const;//加法重载,加一个元素rn CJiHe operator - (const char c) const;//减法重载,减一个元素rnrn void View(void) const;//显示所有成员rnprivate:rn char m_data[27];//存放集合元素,为了运算方便,不足27个时,后面全部为\0,而不只一个\0rn;rnrnrn//----------JiHe.cpp----------已略去不重要的内容----------rnint FindInString(const char *str, const char c)rnrn //全局函数rn //从字符串中查找字符rn //有则返回1,无则返回0rn for (const char *p=str; *p!=NULL; p++)rn rn if (*p == c) return 1;rn rn return 0;rnrnrnCJiHe::CJiHe(void)rnrn //创建空的集合rn memset(m_data, 0, 27);rnrnrnCJiHe::~CJiHe()rnrnrnrnrnCJiHe::CJiHe(const char *str)rnrn //从字符串创建,去除非法字符与重复字符rn int i = 0;//指向m_data开头rn memset(m_data, 0, 27);rn for (const char *p=str; *p!=NULL; p++)rn rn if (*p < 'a') continue;//非法字符rn if (*p > 'z') continue;//同上rn if (!FindInString(m_data, *p)) m_data[i++] = *p;//去除重复元素rn rnrnrnCJiHe::CJiHe(const CJiHe &other)rnrn //拷贝构造rn memcpy(m_data, other.m_data, 27);rnrnrnCJiHe &CJiHe::operator = (const CJiHe &other)rnrn //赋值号重载rn //可以没有返回值,有返回值是方便“a=b=c=d;”这样的运算rn if (&other == this) return *this;//自身赋值rn memcpy(m_data, other.m_data, 27);rn return *this;rnrnrnCJiHe &CJiHe::operator = (const char *str)rnrn //赋值号重载,从字符串赋值rn int i = 0;//指向m_data开头rn memset(m_data, 0, 27);rn for (const char *p=str; *p!=NULL; p++)rn rn if (*p < 'a') continue;//非法字符rn if (*p > 'z') continue;//同上rn if (!FindInString(m_data, *p)) m_data[i++] = *p;//去除重复元素rn rn return *this;rnrnrnCJiHe CJiHe::operator + (const CJiHe &other) constrnrn //加法重载,并集rn char temp[27];rn memcpy(temp, m_data, 27);//照自身复制rn int i = strlen(temp);//指向第一个\0rn for (const char *p=other.m_data; *p!=NULL; p++)rn rn if (!FindInString(temp, *p)) temp[i++] = *p;rn rn return CJiHe(temp);rnrnrnCJiHe CJiHe::operator - (const CJiHe &other) constrnrn //减法重载,差集rn char temp[27];rn memset(temp, 0, 27);rn int i = 0;//指向开头rn for (const char *p=m_data; *p!=NULL; p++)rn rn if (!FindInString(other.m_data, *p)) temp[i++] = *p;rn rn return CJiHe(temp);rnrnrnCJiHe CJiHe::operator * (const CJiHe &other) constrnrn //乘法重载,交集rn char temp[27];rn memset(temp, 0, 27);rn int i = 0;//指向开头rn for (const char *p=m_data; *p!=NULL; p++)rn rn if (FindInString(other.m_data, *p)) temp[i++] = *p;rn rn return CJiHe(temp);rnrnrnCJiHe &CJiHe::operator += (const CJiHe &other)rnrn //+=重载,并集rn int i=strlen(m_data);//指向\0rn for (const char *p=other.m_data; *p!=NULL; p++)rn rn if (!FindInString(m_data, *p)) m_data[i++] = *p;rn rn return *this;rnrnrnCJiHe &CJiHe::operator -= (const CJiHe &other)rnrn //-=重载,差集rn char temp[27];rn memset(temp, 0, 27);rn int i = 0;rn for (const char *p=m_data; *p!=NULL; p++)rn rn if (!FindInString(other.m_data, *p)) temp[i++] = *p;rn rn memcpy(m_data, temp, 27);rn return *this;rnrnrnCJiHe &CJiHe::operator *= (const CJiHe &other)rnrn //*=重载,交集rn char temp[27];rn memset(temp, 0, 27);rn int i = 0;rn for (const char *p=m_data; *p!=NULL; p++)rn rn if (FindInString(other.m_data, *p)) temp[i++] = *p;rn rn memcpy(m_data, temp, 27);rn return *this;rnrnrnCJiHe CJiHe::operator + (const char c) constrnrn //加法重载,加一个元素rn char temp[27];rn memcpy(temp, m_data, 27);//照自身复制rn int i=strlen(temp);rn if (!FindInString(temp, c)) temp[i] = c;//防止重复rn return CJiHe(temp);rnrnrnCJiHe CJiHe::operator - (const char c) constrnrn //减法重载,减一个元素rn char temp[27];rn memset(temp, 0, 27);//设为空rn int i = 0;rn for (const char *p=m_data; *p!=NULL; p++)rn rn if (*p != c) temp[i++] = *p;rn rn return CJiHe(temp);rnrnrnvoid CJiHe::View(void) constrnrn //显示所有成员rn printf("%s\n", m_data);rn 论坛

在类中初始化另一个类

02-22

有这样两个类: class Card、class Deck。rnCard类是扑克牌里任一一张(不包括大小鬼)牌的抽象,即13张牌4种属性;rnDeck类是一副52张(没大小鬼)扑克牌的抽象;rnrn现在有如下代码,请问在Deck类里怎么初始化Card类型私有成员 **array。rn注:Card类有完整的声明和定义代码,Deck类有声明代码,定义代码自己写(即不能改动声明,要按声明写定义)。rnrnrn// File:Card.h 声明Card类rnclass Cardrnrnpublic:rn enum Suitclubs,diamonds,hearts,spades;rn enum Rankace,deuce,trey,four,five,six,seven,eight,nine,ten,jack,queen,king;rn Card(Suit=clubs,Rank=ace);rn Suit getsuit() const;rn Rank getrank() const;rnprivate:rn Suit const suit;rn Rank const rank;rn Card(Card const &);rn;rnrnrn//File Card.cpp 定义Card类rn#include"Card.h"rnCard::Card(Suit s,Rank r):suit(s),rank(r) //构造函数rnrnenum Card::Suit Card::getsuit() constrnrn return suit;rnrnrnenum Card::Rank Card::getrank() constrnrn return rank;rnrnrnrnrnrn//File Deck.h 声明Deck类rn#include"Card.h"rnrnclass Card;rnclass Deckrnrnpublic:rn Deck();rn ~Deck();rn //............rnprivate:rn Card **array;rn //............rnrn;rnrnrn//File Deck.cpp 定义Deck类rn#include"Deck.h"rnDeck::Deck() //Deck类构造函数rnrn rn//就是在这里,要如何初始化Card array呢?rnrnrnrnrnrn//File main.cpprn#include"Deck.h"rnvoid main()rnrn Deck adt;rnrn //some op....rnrnrnrnrn在Deck类定义中默认构造函数里要怎么初始化Card **array,以及析构时怎样删除。rn谢谢啦! 论坛

没有更多推荐了,返回首页