簡體   English   中英

c++ 在 header 中聲明的私有成員與在 cpp 文件中聲明的 static 變量

[英]c++ private member declared in header vs static variable declared in cpp file

我有一個變量,我更喜歡在 cpp 文件而不是 header 文件中聲明。 它應該只能被該 class 的對象訪問。 對於該 class 的每個 object,該變量應該有一個單獨的副本。 Inheritance 不是必需的。

通常,我只是在 class 定義中聲明它。

啊:

class A {
    private:
        int number;
}

但是,我可以這樣做嗎?

乙:

class B {
    private:
        // nothing
}

B.cpp:

static int number;

不,如果您采用第二種方法,則將其設為 static 變量,這意味着您不會為該 class 的每個 object 擁有不同的副本(他們都共享該變量)。

無論哪種方式,如果它只能由 class 訪問,則它應該在 class 聲明中為 go,並且不應是全局變量。 通過將其設為 static 全局變量,您將限制對文件的 scope 的訪問,而不是對 class 的訪問。 作為良好的編程習慣,請嘗試使用盡可能少的全局變量。

如果您的目標是向只看到您的 header 文件的客戶隱藏實現細節(為了保密,或者避免對庫內部的依賴),那么您正在尋找的設計模式是pimpl模式(“指向實現的指針”) .

myclass.h:

class MyClassImpl;

class MyClass
{
    public:
        MyClass();
        ~MyClass();
        int someFunc();

    private:
        MyClassImpl * pimpl;
}

我的類.cpp:

class MyClassImpl
{
    public:
        MyClassImpl();
        int someFunc();

    private:
        // whatever members you actually need
}

MyClass::MyClass()
{
    pimpl = new MyClassImpl();
}

MyClass::~MyClass()
{
    delete pimpl;
}

int MyClass::someFunc()
{
    return pimpl->someFunc();
}

// go on implementing MyClassImpl as you would have implemented MyClass

注意:此示例代碼沒有正確的復制語義。 您可能想改用一些智能指針,或者實現正確的復制構造函數/賦值運算符惡作劇。

可以使用私有實現習慣用法隱藏 cpp 文件中的數據成員。

//a.hpp
struct AData;

class A
{
public:
  A();
private:
  AData* data_members;
};

//a.cpp
struct AData
{
   int number;
};

A::A(): data_members(new AData()) {}

不確定它是否只用一個 integer 就可以得到回報。 但這可以用來減少編譯時間:您可以隨意修改 A 的“數據成員”和實現,而無需重新編譯包括 a.hpp 在內的文件。

此外,更喜歡合適的智能指針而不是普通指針(具有合適的復制行為並且可以用不完整類型聲明的指針)。

This variable should have a separate copy for every object of that class. 

保留它 static 不會讓您實現這一目標。 它將是所有實例共享的一份副本。

如果您希望每個 object 都有自己的number副本,那么您必須使其成為 class 的成員。

If you want a separate copy for every object of your class, you need to declare it in the header file or have some sort of static map between the object value and the value for that object that is initialized by the object constructor.

如果您希望變量與 class object 相關聯,則必須在 class 中聲明它。 所有 object 數據都應在 class 內。 這就是所謂的封裝。

暫無
暫無

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

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