3

注: Visual Studio 2010 を使用しています。

ここには、Date と Directory という 2 つの重要なクラスがあります。

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

Dateこのコードを使用して、3 つのオブジェクトを使用して作成しようとすると、次のようになります。

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は、3つのDate引数がで作成されDate da[3]、コンストラクターの引数が("Hello", 12, d[0], d[1], d[2], 0).

4

2 に答える 2

6

標準によると

初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。

[注:初期化子の構文では()が許可されていないため、

X a();

はクラス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。プログラムをリンクすると、C++ ではこの関数の前方宣言しか見られないため、関数class Directory __cdecl d(void)(d何も取得せずに を返す関数) が定義されていないというエラーが表示されます。Directory

これを解決するには、C++ で次のように記述します。

Directory d;

タイプの変数を作成Dictionaryし、デフォルトのコンストラクターで初期化します。

于 2013-01-26T03:05:52.730 に答える