尝试将'N'定义为类的字符串大小并得到错误

Trying to define 'N' to be string size for a class and getting errors

本文关键字:字符串 错误 定义      更新时间:2023-10-16

我试图将'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 *