C++ C++;:将字符串指针设置为常量字符串值
基本上,我需要创建一个包含id和密钥的元素。id和key的私有值分别为string*和intC++ C++;:将字符串指针设置为常量字符串值,c++,C++,基本上,我需要创建一个包含id和密钥的元素。id和key的私有值分别为string*和int Element::Element(const string & id, int key) { this->id = id; this->key = key; } 在设置此项时,我显然遇到了一些问题 cannot convert ‘const string {aka const std::__cxx11::basic_string<char>}’ to ‘
Element::Element(const string & id, int key) {
this->id = id;
this->key = key;
}
在设置此项时,我显然遇到了一些问题
cannot convert ‘const string {aka const std::__cxx11::basic_string<char>}’ to ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ in assignment
this->id = id;
无法将赋值中的“const string{aka const std::_cx11::basic_string}”转换为“std::_cx11::string*{aka std::_cx11::basic_string*}”
这个->id=id;
所以我想知道如何设置它,使我的私有成员id等于常量字符串&id
编辑:澄清一下,让这些值成为字符串指针和常量字符串不是我的决定。这只是项目的一部分,原因我无法理解。您可能想这样编写您的类:
class Element {
std::string id; // Should these be const?
int key;
public:
Element(const string &id, int key): id(id), key(key) {}
};
这就是
元素中的全部内容吗?然后您可以使用Element=std::pair编写。或者,如果要向容器(如std::vector
或std::set
)添加元素,则可以避免创建新类,而只需使用std::map
。您可能希望这样编写类:
class Element {
std::string id; // Should these be const?
int key;
public:
Element(const string &id, int key): id(id), key(key) {}
};
这就是元素中的全部内容吗?然后您可以使用Element=std::pair编写。或者,如果要将元素添加到容器中,例如std::vector
或std::set
,则可以避免创建新类,而只需使用std::map
。尝试将std::string const&
分配给std::string*
的变量。
这很像试图保存一个值来代替指针。
可能的解决办法是:
this->id = new std::string(id);
它将复制id
并将其存储为成员。但之后一定要清理资源。
但我不能推荐这种解决方案。您真的需要将成员存储为指针吗
如果连接的字符串永远不会更改(在构造函数中只分配一次),则使用引用是更好的解决方案:
... //member definitions
std::string const& id;
...
然后,在构造函数中,您需要指定id:
...
Element::Element(/*Params*/) : id(id) {
...
如果不合适,可以将成员字符串存储为值,这样就不必担心以后清理指针
另外,使用“原始”指针通常是不好的做法。如果指针是绝对必要的(不能用引用或值替换),最好使用std::unique_ptr
或std::shared_ptr
,因为它们可以防止资源泄漏
要编辑的答复:
如果无法在此处删除“指针”,则需要确定是否需要访问最初作为ID传递的字符串的更改。
如果是,那么在初始ID超出范围时,最好使用Mateusz Wojtczak的答案,其中包含潜在的指针问题。
如果没有,只需使用new
进行显式复制即可。不要忘了在析构函数中删除它。您正试图将std::string const&
赋值给std::string*
的变量。
class Element {
private:
std::string id; // <- not a pointer
int key;
public:
Element(const string& Id, int Key) :
id(Id),
key(Key)
{}
};
这很像试图保存一个值来代替指针。
可能的解决办法是:
this->id = new std::string(id);
它将复制id
并将其存储为成员。但之后一定要清理资源。
但我不能推荐这种解决方案。您真的需要将成员存储为指针吗
如果连接的字符串永远不会更改(在构造函数中只分配一次),则使用引用是更好的解决方案:
... //member definitions
std::string const& id;
...
然后,在构造函数中,您需要指定id:
...
Element::Element(/*Params*/) : id(id) {
...
如果不合适,可以将成员字符串存储为值,这样就不必担心以后清理指针
另外,使用“原始”指针通常是不好的做法。如果指针是绝对必要的(不能用引用或值替换),最好使用std::unique_ptr
或std::shared_ptr
,因为它们可以防止资源泄漏
要编辑的答复:
如果无法在此处删除“指针”,则需要确定是否需要访问最初作为ID传递的字符串的更改。
如果是,那么在初始ID超出范围时,最好使用Mateusz Wojtczak的答案,其中包含潜在的指针问题。
如果没有,只需使用new
进行显式复制即可。只是别忘了在析构函数中删除它。类元素{
class Element {
private:
std::string id; // <- not a pointer
int key;
public:
Element(const string& Id, int Key) :
id(Id),
key(Key)
{}
};
私人:
std::string id;//类元素{
私人:
std::string id;//这是因为您正在将引用分配给指针。将地址分配给指针,并保留常量,“id”应该是指向常量的指针:
const std::string* id;
和任务:
this->id = &id;
这就是解释。另一件事是,如果删除处理的对象,这可能会导致指针悬空。这是因为您将引用分配给指针。将地址分配给指针,并保留常量,“id”应该是指向常量的指针:
const std::string* id;
和任务:
this->id = &id;
这就是解释。另一件事是,如果删除处理的对象,这可能会导致指针悬空。为什么不将成员变量更改为std::string
,而不是std::string*
?在类中有一个裸露的std::string*
指针听起来像是一个糟糕的设计,值得重新使用。除非ess您拥有被指向的资源。是您吗?我的意思是,具有指针的类应该拥有被指向的资源。跨对象指针是一个非常糟糕的主意,因为您不知道被指向的对象是否/何时具有与您的指针匹配的生存期,并且无法获取该信息。为什么不将您的成员变量更改为std::string
而不是std::string*
?在类中有一个裸露的std::string*
指针听起来很糟糕,值得重温。除非你拥有被指向的资源,否则不应该使用指针。是你吗?我的意思是,拥有指针的类应该拥有被指向的资源。跨对象指针是一个非常重要的问题坏主意,因为你不知道被指向的物体是否有生命