2015-10-23 49 views
-1

我有以下情況:使用工廠創建一個類,這是在其他類中使用

工廠類的實現:

class FactoryClassA { 
    public: 
     FactoryClassA(){}; 
     ~FactoryClassA(){}; 

     ClassA create(double a, double b) { 
      return ClassA; 
     }; 
}; 

ClassA的實現:

class ClassA { 
    friend class FactoryClassA 
    ~FactoryClassA() {} 
    private: 
     ClassA(double a = 0, double b = 0) 
     { 
      a(a), 
      b(b) 
     }; 
     double a; 
     double b; 
}; 

OtherClass實施:

class OtherClass { 
    public: 
     OtherClass() { 
      ClassFactory myClassAFactory; 
      aClassA = myClassAFactory.create(); 
     } 
     ~OtherClass() {}; 

    private: 
     aClassA; 
}; 

不幸的是,這是行不通的。因爲在OtherClass的(空)成員初始值設定項列表中,將調用ClassA的空構造函數,該構造函數不存在。

我之所以構造出ClassAprivate,是因爲我希望用戶只通過FactoryClassA創建ClassA的對象。

+1

那麼,什麼是問題? – ergonaut

+2

請修復您的代碼:縮進並添加';' – Walter

+0

1.您不要將FactoryClassA的析構函數放在另一個類中。 2. ClassFactory未定義。 3.「朋友」應該在大括號之外。 –

回答

2

首先,create()應該有一個返回類型:

ClassA create(double a, double b) { 
    return {a, b}; 
} 

我不是通過其他所有的語法錯誤會。請修復它們,因爲其他人可能在搜索答案時發現您的問題。請讓他們很容易理解你的問題。

因爲編譯器必須知道ClassA對象的大小以及要使用的構造函數,所以在定義了ClassA之後,必須在代碼中。

其次,只是在構造函數體之前,你的成員初始化:

OtherClass() : 
    aClassA{ClassFactory{}.create(0.0, 0.0)} 
{} 

你可能更具有create()ClassFactory靜態成員函數。然後OtherClass構造是這樣的:

OtherClass() : 
    aClassA{ClassFactory::create(0.0, 0.0)} 
{} 

這是更直觀。

0

此代碼充滿了小錯誤,這使得它不可用。對成員初始化爲一類一語法是:

class A { 
    A(x, y): m_a(x) { ... } 
    ... 
} 

和類聲明的語句,以便他們所需要的最終;

接下來,析構函數的一類,如果你希望能夠使用必須公開臨時對象。

默認值不應該在ClassA ctor中,而應該在create工廠方法中。

最後,你應該在OtherClass中使用靜態工廠,不需要爲每個對象創建一個新工廠。

代碼變爲:

class FactoryClassA; 

class ClassA { 
public: 
    friend class FactoryClassA; 
    ~ClassA(){} 
private: 
    ClassA(double a, double b):a(a),b(b){} 
    double a; 
    double b; 
}; 

class FactoryClassA { 
public: 
    FactoryClassA(){} 
    ~FactoryClassA(){} 

    ClassA create(double a = 0, double b = 0) { 
     return ClassA(a, b); 
    } 
}; 

class OtherClass { 
public: 
    OtherClass(): aClassA(myClassAFactory.create()){} 
    ~OtherClass(){} 

private: 
    static FactoryClassA myClassAFactory; 
    ClassA aClassA; 

}; 

FactoryClassA OtherClass::myClassAFactory; 

從原來的不遠處,但那些編譯...