2011-09-30 110 views
2

我得到的錯誤error: ‘Name’ was not declared in this scope 缺少什麼我在這裏。使用靜態爲const char * const的,而不是#定義

源文件:

#include<iostream> 
#include "scr.h" 
using namespace std; 

const char* const Test::Name; 

void Test::Print() 
{ 
    cout<<Name; 
} 

int main() 
{  
    Test *t = new Test(); 
    t->Print(); 
    delete t; 
} 

頭文件:

class Test 
{ 
    static const char* const Name = "Product Name"; 
    public: 
     void Print(); 
}; 

編輯:

如果我更換char* constint,它的工作原理。爲什麼?

static const int Name = 4; //in header 

const int Test::Name; //In source 

該代碼的目的是爲有效C++中提到的#define備用。在那裏的例子中,static const int被使用。

回答

2

你不能initialize成員類定義。

看看Parashift後 - Can I add = initializer; to the declaration of a class-scope static const data member?

摘要:的告誡是,你可能只用integralenumeration類型做到這一點,那初始化表達式必須是 表達式,可以計算在編譯時:它必須只包含其他 常數,可能與內置運營商合併。

+0

請參閱編輯的問題 – devnull

+1

@ cod3r - 閱讀我發佈的鏈接。 – adatapost

+0

感謝您的鏈接。這是非常豐富的 – devnull

1

一般情況下,你不能直接在類定義中初始化靜態變量,你必須做一個單獨的源文件,像這樣:

const char* const Test::Name = "Product Name"; 

一個例外是整型常量,其被允許在類定義中。一個簡單的解決方法是使用靜態成員函數代替:

struct Test { 
    static const char *Name() { return "Product Name"; } 
}; 
0

將字符串的賦值移至源/實現文件(.cpp)。

3

不能初始化類中的靜態成員變量。甚至不在頭文件中。

頭文件:

class Test 
{ 
    static const char* const Name; 
    public: 
     void Print(); 
}; 

在你的CPP文件:

const char* const Test::Name = "Product Name"; 

編輯: 我必須補充說,初始化只允許INT和枚舉,並且也與常量,可以在編譯時進行評估。

+0

這是不正確的。查看編輯的問題。 – devnull

+1

希望編輯清楚 – krammer

相關問題