尝试将'N'定义为类的字符串大小并得到错误
Trying to define 'N' to be string size for a class and getting errors
我试图将'N'定义为类中的字符数,通过#定义N 10在我的.h文件的开头,当我这样做的时候,我会得到很多错误,包括丢失(,丢失(等
这是我的代码:
#define N 10;
class String
{
private:
char str[N];
public:
String();
String(char[]);
~String();
};
当我把它改成时
char str[10];
它确实有效,不是应该是一样的吗?
谢谢。
#define N 10;
// ^
所以char str[N];
变成
char str[10;];
// ^
请记住,预处理器只是替换您为宏指定的内容。您指定了10;
,以便它为N
插入10;
。
一个比去除讨厌的;
更好的解决方案是做这样的事情1
class String
{
private:
static const int numChars = 10;
char str[numChars];
public:
String();
String(char[]);
~String();
};
很有可能,除了String
之外,您不需要在代码的其他部分使用N
,那么为什么不在String
中定义一些更好的内容呢?"更好的东西"是因为人们普遍认为宏是邪恶的,因此不使用宏会让你不邪恶(或者至少不那么邪恶(。
1您应该注意这一点:在类定义中定义静态常量整数成员
#define N 10;
最后的;
造成了问题。移除它。
#define N 10
#define N 10;
应为#define N 10
如果你不想在类中使用幻数并将其放在外面,#define不是最好的方法,因为它具有全局效果,即N出现在代码中的任何地方,它都将被10取代。你可能想本地化。
您可以在命名空间中执行此操作,并在该命名空间中声明const size_t。
namespace MyModule {
const size_t STRING_ARRAY_SIZE = 10; // you do want the semi-colon
}
class String
{
private:
char str[ MyModule::STRING_ARRAY_SIZE ];
// rest of class
};
如果类String
在名称空间MyModule中,则不需要在类中使用::
进行限定。如果你想把尺寸限制在班级内,你可以把它放在那里。
请注意,无论您将它放在哪里以及如何定义,它都必须是一个编译时常数。它不是可以存储在配置中的东西,因为在编译时必须知道数组大小,因为sizeof(String)
取决于它
顺便说一句,字符串通常用一个用于短字符串的静态数组和一个用于长字符串的动态数组来实现。对于不可变的字符串,有时会使用一些"共享"数组来实现长字符串。它可能会使swap()
难以实现,但它可以用更少的动态分配来提高效率。
你的构造函数采用char[]
并不是一个好主意。可能应该服用const char *
。
- C++函数的字符串错误"find_first_of"
- 流字符串错误输出
- 在图像上覆盖文本的程序会产生无休止的字符串错误
- 字符串错误的向量
- C++字数统计程序使用C字符串错误在程序运行后
- 从函数返回字符串C++错误
- 字符串错误或编译器错误
- SQL 字符串错误?没有这样的列
- C/C++ 字符串错误与 ARM SEG 故障总线错误
- 字符串错误输出
- C++调用堆上的类(空字符串错误)
- 运行时字符串错误C++
- 字符串递归函数中的字符串错误
- 从文本文件/文本流中读取Q字符串错误
- 动态内存c++程序中的字符串错误
- 发现c++正则表达式子字符串错误模式
- 在Cocos2d-x中比较字符串错误
- c++读TXT到字符串错误
- 字符串错误检查
- Chromium嵌入式框架VS2013字符串错误