簡體   English   中英

如何從C ++中的靜態成員函數訪問非靜態成員?

[英]How to access a non-static member from a static member function in C++?

我寫了以下代碼:

class A
{
    public:
    int cnt;
    static void inc(){
        d.cnt=0;
    }
};

int main()
{
   A d;
   return 0;
}

我已經看到了這個問題:

如何在不傳遞類實例的情況下從靜態成員函數調用非靜態成員函數

但是我不想使用指針。 我可以不使用指針就能做到嗎?

編輯:

我已經看到以下問題:

如何從Java中的靜態方法訪問非靜態成員?

我為什么不能做這樣的事情?

不,如果沒有指向對象實例的指針,就無法從靜態函數調用非靜態成員函數。 否則編譯器將如何知道在哪個對象上調用該函數?

就像其他人指出的那樣,您需要訪問對象才能對其執行操作,包括訪問其成員變量。

從技術上講,您可以像下面的我的zeroBad()函數那樣編寫代碼。 但是,由於仍然需要訪問該對象,因此也可以使其成為成員函數,例如zeroGood()

class A
{
    int count;

public:
    A() : count(42) {}

    // Zero someone else
    static void zeroBad(A& other) {
        other.count = 0;
    }

    // Zero myself
    void zeroGood() {
        count = 0;
    }
};

int main()
{
    A a;

    A::zeroBad(a); // You don't really want to do this
    a.zeroGood();  // You want this
}

更新:

您也可以在C ++中實現Singleton模式。 除非您有非常具體的原因,否則您可能不想這樣做。 例如,由於很難測試,因此Singleton被許多人視為反模式 如果您發現自己想要這樣做,則重構程序或重新設計可能是最好的解決方案。

如果不使用指針,則不能在靜態函數內使用非靜態成員變量或函數。

本身並不需要指針,但是確實需要訪問通過其訪問非靜態變量的對象。 在您的示例中,對象d對A :: inc()不可見。 如果d是main的全局變量而不是局部變量,那么您的示例將起作用。

就是說,很好奇為什么您要花大力氣避免在C ++中使用指針。

暫無
暫無

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

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