2017-09-27 78 views
0

我已經看過其他幾個問題,但我的情況似乎比我經歷過的情況簡單很多,所以我會問我的情況。Visual C++:沒有默認的構造函數

Learn.h:

#ifndef LEARN_H 
#define LEARN_H 

class Learn 
{ 
public: 
    Learn(int x); 
    ~Learn(); 

private: 
    const int favourite; 
}; 

#endif 

Learn.cpp:

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

Learn::Learn(int x=0): favourite(x) 
{ 
    cout << "Constructor" << endl; 
} 

Learn::~Learn() 
{ 
    cout << "Destructor" << endl; 
} 

Source.cpp:

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

int main() { 
    cout << "What's your favourite integer? "; 
    int x; cin >> x; 
    Learn(0); 

    system("PAUSE"); 
} 

本身上面的代碼不輸出任何誤差。

但是,在將Learn(0)替換爲Learn(x)後,我確實遇到了一些錯誤。它們是:

  • 錯誤E0291:no default constructor exists for class Learn
  • Error C2371'x' : redefinition; different basic types
  • Error C2512'Learn' : no appropriate default constructor available

的任何原因?我真的想要輸入整數變量x而不是0。我知道這只是練習,我是新手,但真的,我有點困惑,爲什麼這不起作用。

任何幫助,將不勝感激,謝謝。

+1

您試圖在.cpp中指定x的默認值(在Learn ctor中)。你應該在頭文件中定義它。 – ZeroUltimax

+0

@ZeroUltimax對於默認參數是正確的,但編譯器抱怨的真正原因是它認爲你正在試圖定義一個名爲'Learn'的函數。你不能像你想要的那樣調用構造函數。你需要使用'Learn some_name(x);'。 – Jonesinator

+0

[OT]:'Learn :: Learn(int x = 0)'在你的cpp中沒用,因爲默認值只在該cpp文件中可用。刪除它,或將其放置在標題中。 – Jarod42

回答

5

解析問題:

Learn(x); 

被解析爲

Learn x; 

您應該使用

Learn{x}; 

建立你暫時的。

+1

也許最好給它一個名字:'學習tmp {x};' – rustyx

+2

@RustyX:這不再是一個臨時的,''Destructor「的打印將在暫停後發生。如果你想完全命名它,可能使用額外的範圍'{Learn tmp {x};}'。 – Jarod42

+0

@ Jarod42什麼是臨時的?對不起,C++有點新鮮。 另外,有點困惑,爲什麼括號裏的改變在這裏有所不同。 –

0

好的,我想出了我遇到的問題。我沒有意識到這個調用是作爲對象分配的一部分完成的。 C++中的符號似乎有點不同。

所以Learn(x)顯然應該用Learn obj(x)代替。

這種表示方法與其他編程語言有所不同,您可以在其中編寫className(inputs) variableName