2013-03-26 67 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); 
相关问题