我的代码出现问题。我很难过。 我有一个数据成员,它是一个指向字符串类型的指针。 我使用构造函数作为此指针的defualt initialer,然后当我在main函数中调用一个对象时,初始化指针指向存储字符串的内存地址并打印内容。这应该是应该发生的,但我不能让程序工作。请问有人请告诉我哪里出错了?
#include<iostream>
#include<string>
using namespace std;
class NoName{
public:
NoName(string &sName("Alice In Wonderland") ){};
private:
string *pstring;
};
int main(){
//the constructor will be automatically called here once a object is created
// and the string "Alice in Wonderland" will appear on the screen
return 0;
}
答案 0 :(得分:5)
只需使用std::string
成员并在 Member initializer list 中对其进行初始化:
private:
string mstring;
public:
NoName():mstring("Alice In Wonderland"){}
你也可以让构造函数接受一个参数,而不是硬编码字符串,让用户在运行时传递字符串:
NoName(std::string str):mstring(str){}
您不需要指针。通过使用指向std::string
的指针,您可以消除std::string
提供的隐式手动内存管理的优势。
答案 1 :(得分:2)
如果由于某种原因确实需要存储指针,那么需要记住一些要点:
new Class
new
时,请考虑您要写下delete
的位置。 (在这种情况下,它会进入析构函数。delete
),那么你还需要一个复制构造函数和复制赋值运算符。这是代码看起来的一种方式:http://ideone.com/21yGgC
#include<iostream>
#include<string>
using std::cout; using std::endl;
using std::string;
class NoName
{
public:
NoName(string sName = "Alice In Wonderland") :
pstring(new string(sName))
{
cout << "ctor - " << *pstring << endl;
}
NoName(const NoName& rhs) :
pstring(new string(*rhs.pstring))
{
cout << "Copy ctor - " << *pstring << endl;
}
NoName& operator=(const NoName& rhs)
{
*pstring = *rhs.pstring;
cout << "Copy assignment operator - " << *pstring << endl;
return *this;
}
~NoName()
{
cout << "dtor, my name was " << *pstring << endl;
delete pstring;
}
private:
string *pstring;
};
int main()
{
NoName m, n("Another name");
NoName o(m);
o = n;
return 0;
}
请注意,如果您不使用不必要的指针,那将会更容易:
class Better
{
public:
Better(string sName = "Alice In Wonderland") :
m_string(sName)
{
}
private:
string m_string;
};
因为您不需要自定义析构函数,所以您也不需要复制构造函数或复制赋值运算符。更容易!
答案 2 :(得分:0)
您没有正确使用构造函数。首先,您创建此引用参数并尝试将其初始化为字符串对象(这就是问题)。其次,你的构造函数实际上从不做任何事情。
您需要在指针上调用new
,取消引用它并将数据指向一个值,使用std::cout
输出解除引用的值,然后使用delete
清除内存析构函数(或者在这种情况下,如果你不打算再次使用该字符串,你可以在使用cout之后再执行它。但是如果你还需要它,那么在析构函数中做它。)
假设你正在上课,你的教科书应该告诉你如何做这些事情。
编辑:这也不是默认构造函数。我改变了你的标签以适当匹配。