2013-03-26 80 views
7

我是c++的新手,我在構造函數和類中遇到困難。所以,這裏是我的頭文件:沒有合適的構造函數存在將「測試*」轉換爲「測試」,構造函數,

#pragma once 
#include <string> 
using namespace std; 
class test 
{ 

    private: 
    string name; 
    int number; 

public: 

    test(); 
    test(string i,int b); 
}; 

這是CPP文件:

#include "test.h" 
#include <string> 
using namespace std; 


test::test(){} 

test::test(string i,int b){ 
    this->name=i; 
    this->number=b; 
} 

現在,當我嘗試調用

test t=new test("rrr",8); 

我得到:

1 IntelliSense: no suitable constructor exists to convert from "test *" to "test" 

那麼,什麼類的事情*在他們的名字(例如,沒有.cpp文件的類沒有asterix,所有其他人都可以)?我做錯了什麼?

回答

21

我想你是來自Java/C#背景。 t這裏不是引用類型,它是一個值類型。 new返回一個指向對象的指針。所以你需要以下任何一種:

test t = test("rrr", 8); 
test t("rrr", 8); 
test *t = new test("rrr", 8); 

如果你還不熟悉指針,那麼絕對不要使用最後一個!但理解指針的語義是相當關鍵的;我建議在閱讀課本相關的章節,...

+0

不錯,你的答案比我的好多了:) +1 – 2013-03-26 13:01:30

+0

tnx很多。你猜對了,我在java和c#編程,所以我有點努力與c + + :) – klo 2013-03-26 13:08:25

+0

@klo如果你嘗試編程C++就像你編程的Java,你會犯大量的錯誤。他們根本不是很相似。 – john 2013-03-26 13:26:45

2
test t=new test("rrr",8); 

必須

// v 
test* t=new test("rrr",8); 

那麼,什麼

*使用在他們的名字與具有類的東西 「*」 來表示一個指針,它的不是以班級的名義。但這是一個很大的話題,所以你應該對此進行一些研究。

0

你沒有定義t爲指針:

test* t=new test("rrr",8); 

或者只是

test t = test("rrr",8); 
0
T* t = new T; 
//  ^^^ 

當新的在這個對象構造中使用,它表示創建一個指針。正在做的是動態分配內存,我敢肯定你並不想這麼做。該相反,典型的堆棧中分配對象建設這樣做簡單:

T t; 

即使你本來打算創建一個指針和分配內存,你做了錯誤的方式。使用代碼中缺少的*符號創建指針。其次,當您完成使用您創建的內存時,您必須記住您的代碼delete/delete[]delete[]用於動態分配的陣列。因此,這是它會怎樣看你的指針:

delete t; 
1

*不是名稱的一部分,這是一個修改器表示,該物體是一個指針。指針是一個變量,它保存地址到內存中的某個地方,實際的對象被存儲在那裏。一些基礎知識:

int i = 5; 
int * pI = &i; 

int * pI手段,要聲明一個指針在內存中,其中一個int舉行的地方。 &i表示您想要檢索指向變量的指針。所以現在pI在內存中保存地址,我在那裏存儲。現在,您可以取消引用指針 - 讓指針的值:

int j = *pI; 

現在你告訴編譯器,它應該去指向的地址等電點和retreive其內容(PI是一個指針爲int,編譯器會假設,那裏有一個int)。

現在回到你的例子。 new操作者動態地爲一個對象分配內存,所以:

new test("rrr", 8); 

導致分配用於測試類的存儲器,調用它與參數「RRR」和8並返回一個指針,指向分配的存儲器的構造。這就是爲什麼你不能將它分配給test變量:在這種情況下,新運營商返回test *

試試這個代碼:

test * t = new test("rrr", 8); 
5

所以,什麼在他們的名字與具有類的東西「*」(例如類,而.cpp文件中不要有星號,所有其他人做)? ?

你肯定需要了解指針。在C++中,test *test是兩種完全不同的類型。這裏有兩個變量與類型:

test t; 
test* p; 

這裏,t的類型爲test,並ptest*類型。我們將test*描述爲「指向test」。

您經常可以將指針看作是對象的內存地址。所以在p中,由於它是一個指針,我們可以存儲內存地址t,這是一個test。爲了得到一個對象的地址,我們使用一元&運營商,像這樣:

test t; 
test* p = &t; 

注意t一個test對象。你不需要說new test()。這就是C++與您可能使用的其他語言(如C#和Java)不同的地方。在上面的C++代碼中,t是一個test對象。

但是,你可以new test()創建對象,所以有什麼區別?

test t;創建具有自動存儲持續時間的test對象。這意味着它在其作用域的末尾被銷燬(通常該功能正在被聲明)。

new test()創建具有動態存儲持續時間的test對象。這意味着你必須手動銷燬對象,否則你將會發生內存泄漏。該表達式返回一個指針,這樣你就可以初始化它的指針對象:

test* p = new test(); 

所以,現在讓我們來看看你的問題:

test t=new test("rrr",8); 

我們現在知道,new test("rrr", 8)返回一個指向test(一test*)。但是,您正嘗試將其分配給test對象。你根本無法做到這一點。其中一個是地址,另一個是test。因此,編譯器說:「沒有合適的構造函數可以將test *轉換爲test。」現在有道理,不是嗎?

相反,您應該更喜歡使用自動存儲持續時間。如果你確實需要,只能使用new。所以只是做:

test t("rrr", 8);