C++ C++;:将字符串指针设置为常量字符串值

C++ 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 ‘

基本上,我需要创建一个包含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 ‘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*
指针听起来很糟糕,值得重温。除非你拥有被指向的资源,否则不应该使用指针。是你吗?我的意思是,拥有指针的类应该拥有被指向的资源。跨对象指针是一个非常重要的问题坏主意,因为你不知道被指向的物体是否有生命