2012-08-29 44 views
0

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

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

简单的例子:

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正是我所期待的。

+2

你能提供一些关于如何使用这个名字的伪代码吗?作为对象ID,或作为调试手段,或... – xtofl

+0

['std :: map'](http://en.cppreference.com/w/cpp/container/map)? –

+0

你的意思是你想要命名这些结构的实例(对象)吗? –

回答

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; 
+0

std :: cout << f2.name()... - 为什么括号? – neagoegab

+0

@neagoegab错字,现在修复,谢谢。 – juanchopanza

1

如果你可以用一个结构来完成它,你可以用一个类来完成。我假设'名字结构'是指通过键存储他们?您可以使用map来达到此目的。如果你打算使用类(我建议)来做,你可以使用map<string, BaseDataClass*>,并为不同的变量组派生BaseDataClass

+1

这会导致切片,你需要一个指向基类的指针或智能指针的映射。 – juanchopanza

+0

@juanchopanza谢谢你指出,你是绝对正确的。编辑帖子反映了这一点。 – pauluss86

0

因为不同的服务器上都会有不同的数据集的数量, 我希望能够名称与结构字符串或可以做类似的事情 。

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

#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"]; } 
相关问题