【问题标题】:How can I pass a string or something similar as the name for a struct or object?如何传递字符串或类似于结构或对象名称的东西?
【发布时间】:2012-08-23 16:41:38
【问题描述】:

我正在编写一个程序,该程序将从服务器中提取可变数量的数据。我将使用三种不同的结构来保存三组不同的变量(尽管我想知道这是否也可以用一个类来完成)。因为不同的服务器会有不同数量的数据集,所以我希望能够用字符串命名结构或能够做类似的事情。

有什么办法可以解决这个问题,或者有什么好的做法可以做类似的事情吗?提前致谢。

快速示例:

struct foo {
    std::string name;
    std::string ipAddress;
    std::string macAddress;
};

struct bar {
    std::string dhcpServer;
    std::string tftpServer;
};

foo [string_as_name_one];  
bar [string_as_name_two];

我希望任意命名结构。 map 看起来与我正在寻找的相似,所以我现在正在阅读它。

感谢您的帮助和快速响应,map 正是我想要的。

【问题讨论】:

  • 您能否提供一些关于如何使用此名称的伪代码?作为对象 ID,或作为调试手段,或...
  • std::map 怎么样?
  • 您的意思是要命名这些结构的实例(对象)吗?
  • structclass 基本相同。见here
  • @MarkGarcia 我相信类型本身。

标签: c++ string class object struct


【解决方案1】:

如果你想要一个有名字的结构:

struct Foo {
  std::string name;
  Foo(const std::string& name) : name(name) {}
};

Foo f1("Bob");
Foo f2("Mary");
std::cout << f2.name << "\n";

如果你想要的只是一个可以存储在集合中并根据名称查找的结构,那么你可以使用std::mapstd::unordered_map

struct Bar{};
std::map<std::string, Bar> m;
Bar b1, b2;
m["Bob"] = b1;
m["Mary"] = b2;

【讨论】:

  • std::cout
【解决方案2】:

如果你可以用结构来做,你可以用类来做。我假设“名称结构”是指按键存储它们?为此,您可以使用map。如果您打算使用类(我推荐)来做这件事,您可以使用 map&lt;string, BaseDataClass*&gt; 并为不同的变量集派生 BaseDataClass

【讨论】:

  • 这会导致切片,你需要一个指向基类的指针或智能指针的映射。
  • @juanchopanza 感谢您指出这一点,您完全正确。编辑帖子以反映这一点。
【解决方案3】:

因为不同的服务器会有不同数量的数据集, 我希望能够用字符串命名结构或能够做到 类似的东西。

您不需要“用字符串命名结构”,只需将检索到的数据放入某种键值存储中即可。

#include <map>
#include <string>

typedef std::map<std::string, std::string> server_result;
struct server
{
   server(std::string uri): uri(uri) {}
   server_result get(){ server_result result; /* retrieve results, put them in result[name]= value; */ return result; }

   private:
   std::string uri;
};

// or

class server
{
   std::string uri;

   public:
   server(std::string uri): uri(uri) {}
   server_result get(){ server_result result; /* retrieve results, put them in result[key]= value; */ return result; }
};

// use it like

#include <iostream>
#include <ostream>
int main(){ server_result result= server("42.42.42.42").get(); std::cout<< result["omg"]; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2011-03-02
    • 2020-01-25
    相关资源
    最近更新 更多