2012-08-30 161 views
0

我有一個跨越兩個文件的類。它在declare.h文件中聲明,並在define.cpp文件中定義。C++中的代碼組織

define.h

class A{ 
    public: int a; 
      void func(){ a = some_other_func(); } 
      A(); 
}; 

define.cpp

A::A(){ 
    a =0; 
} 

總體思想​​是在一個內聯函數使用它之前初始化在構造函數中的變量。但構造函數定義和函數定義在不同的文件中。這有什麼問題嗎?

+0

這通常不是一個好的做法,除非'declare.h'包含'define.h';在這種情況下,'define.h'被稱爲私有或實現部分;通常人們把它命名爲'declare_priv.h' ... –

+0

它是'define.h'還是'define.cpp'?你的問題提到兩個! –

+3

請注意'A :: A()'內部的'int a = 0;'不會初始化'int A :: a;'!實際上你正在聲明一個局部變量。它應該是簡單的'a = 0;'或甚至更好的擁有'A :: A():a(0){}' – iammilind

回答

0

聲明/定義分離絕對沒有問題,只要declare.h包含在define.cpp中。但是usulal的做法是讓實現文件與聲明文件具有相同的名稱,禁止使用後綴。所以你的情況可能是A.hA.cpp

但是,初始化成員變量a本身存在問題。您可能要在構造函數初始化列表初始化int a

A::A() : a(0) {} 

在你的代碼,它是並不被初始化。您正在創建並初始化一個名爲a的局部變量,它是構造函數體中的局部變量。據推測,這不是你想要的。

+1

問題是構造函數中的'a'是局部變量而不是成員變量,即使它發生了什麼是*作業*而不是*初始化* –

+1

@Als哇,很好的發現。 – juanchopanza

+0

@juanchopanza謝謝:) –

0

你需要#include "declare.h"define.cpp然後寫構造函數爲A::A() : a(0){}

0

雖然通常這不是技術問題。您應該採用.h文件與您的代碼的接口的約定,因此它們應該只有一些其他代碼需要調用您的代碼。

+0

問題是構造函數中的'a'是一個局部變量而不是一個成員變量,即使它發生了什麼是*賦值*而不是*初始化* –