3

注意:我使用的是 Visual Studio 2010。

这里有两个重要的类,日期和目录。

class Date
{
private:
    int month, day, year;
public:
    Date();
    Date(int month, int day, int year);
};

class Directory : public [Superclass]
{
private:
    File* fileContents[50];
    Directory* dirContents[5];
public:
    Directory();
    Directory(char* name, 
        long size, 
        Date dateCreated, 
        Date dateModified,
        Date dateAccessed,
        int attributes);
};

我在更远的地方定义了构造函数——Date构造函数就像你想象的那样工作。现在,我真的是 C++ 新手,所以我什至无法理解我收到的错误消息。如果我尝试使用默认构造函数Directory,我会收到以下错误消息:

error LNK2019: unresolved external symbol "class Directory __cdecl d(void)" (?d@@YA?AVDirectory@@XZ) referenced in function _main

如果我尝试使用 3 个Date对象来实现它,请使用以下代码:

int main()
{
    Date d1();
    Date d2();
    Date d3();
    Directory d("Hello", 12, d1, d2, d3, 0);
    cout << d;
}

这些是我的错误信息:

error C2664: 'Directory::Directory(char *,long,Date,Date,Date,int)' : cannot convert parameter 3 from 'Date (__cdecl *)(void)' to 'Date'

智能感知:no instance of constructor "Directory::Directory" matches the argument list

编辑:因此,为了继续努力让我觉得零意义,VS 决定在Date创建三个参数Date da[3]并且构造函数的参数是("Hello", 12, d[0], d[1], d[2], 0).

4

2 回答 2

6

根据标准

初始值设定项为空括号集的对象,即 (),应进行值初始化。

[注意:由于初始化程序的语法不允许 (),

X一();

不是类 X 的对象的声明,而是不带参数并返回 X 的函数的声明。在某些其他初始化上下文(5.3.4、5.2.3、12.6.2)中允许使用 () 形式。——尾注]

因此,您需要按如下方式更改您的声明

int main()
{
    Date d1;
    Date d2;
    Date d3;
    Directory d("Hello", 12, d1, d2, d3, 0);
    cout << d;
}
于 2013-01-26T02:25:02.920 回答
3

当涉及到变量声明时,C++ 有一个相当烦人的极端情况。

以下是合法的 C++:

int main() {
    int foo(int x);
    return foo(42);
}

它只是设置了一个在 .foo范围内命名的函数的声明main。要让程序运行,foo需要在某个地方定义,否则会出现链接错误。

现在,考虑

Date foo();

foo这是不带参数并返回Date对象的函数的前向声明的语法。但是,是使用单个整数作为参数初始化的类型Date foo(42);变量的声明。您的编译器通常会根据参数是类型还是表达式来确定您是否需要变量或函数,但在零参数情况下(默认构造函数),编译器无法判断,因此默认为函数声明(因为标准是这样说的)。fooDate

所以,通过写

Directory d();

您前向声明了一个d不带任何内容并返回的函数Directory。当您链接程序时,您会收到一条错误消息,指出该函数class Directory __cdecl d(void)(称为d不接受任何内容并返回 a的函数Directory)未定义,因为 C++ 仅看到此函数的前向声明。

为了解决这个问题,在 C++ 中,编写

Directory d;

将创建一个类型变量Dictionary并使用默认构造函数对其进行初始化。

于 2013-01-26T03:05:52.730 回答