簡體   English   中英

C ++前向聲明

[英]c++ forward declaration

#include <iostream>
#include <cstring>
using namespace std;

class Obj;


class Test {
    friend class Obj;
public:
    Test()
    {

    }
    ~Test()
    {

    }
    void foo()
    {
        //print();
            //Obj::print();
            //Obj x;
            //x.print();
    }
};

class Obj {
public:
    void print()
    {
        cout << "print here" << endl;
    }
};

int main()
{
    Test test;
    test.foo();
    return 0;
}

快速問題,如何在Test :: foo()中調用正確的打印方式?

您需要 Obj定義之后定義成員函數:

class Test { 
public:
    void foo();
};

class Obj {
public:
    void print() { }
};

void Test::foo() { 
    Obj o;
    o.print();
}

如james所述,您應該在Obj定義之后定義成員函數。 另外,您正在調用Obj :: print,但是print不是靜態成員函數,因此您必須在Obj實例而非Obj本身上調用它。

如果您確實希望print是靜態成員,請聲明它。

class Obj {
public:
    static void print(){ blah }
}

同樣,您無需使Obj成為朋友即可訪問其公共方法。

也可以OP請定義“正確的方式”,我假設您希望它是一個靜態成員函數,如果您希望每個Test實例一個Obj實例,詹姆斯的答案是正確的。

更新的OP,根據您的評論,在Test中使用Obj之前,必須先聲明Obj以及打印。 這可以通過多種方式實現:

  • 在測試前移動整個類的對象定義(和聲明)
  • 用其類定義聲明Obj的方法,然后再定義它們。
  • 像您一樣聲明Test並根據James的帖子(在Obj之后)定義Test。

以下工作正常:

#include <iostream>
#include <cstring>
using namespace std;

class Obj {
public:
    static void print()
    {
        cout << "print here" << endl;
    }
};

class Test {
public:
    Test()
    {

    }
    ~Test()
    {

    }
    void foo()
    {
            Obj::print();
    }
};

int main()
{
    Test test;
    test.foo();
    return 0;
}

但是(在我看來)將除最瑣碎的情況之外的所有情況的聲明與定義分開總是更好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM