我想根据文件中按行收集的数据创建一个结构。每行都需要一个新结构,并且在 while 循环中访问这些行。在 C# 中,我通过创建匿名结构并将它们添加到结构列表来做到这一点。 C++ 似乎不允许匿名结构。我试着用一个递增的变量来命名它们,但这没有用,因为变量名是按字面意思取的——无论如何,我不想被迫使用这种方法,因为我讨厌无关名称的想法。我想我可以通过一个独特的属性来命名结构,但是,显然,我宁愿使用一个属性作为。 . .属性(property)。此外,如果它们不一定都是唯一的怎么办?
有人可以提出建议或解释我所缺少的东西吗?
谢谢!
在 c# 中(伪:
public static List<Referral> Referrals = new List<Referral>();
//in loop:
var NewReferral = new Referral(referringURL.Trim(), referringWords.Trim().ToLower() , 1);
if ( NewReferral.URL == referringURL.Trim() ) {Referrals.Add(NewReferral);
在 C++ 中:
list<CollectedData> AllData;
ifstream myFile("test_data.txt");
if (myFile.fail()) {cout << "Error opening file"; return 0;}
else
{
cout << "File opened... \n";
while( getline(myFile, line) ) {
struct CollectedData;
//add property values
//add struct to struct list
}
}
(请详细说明它们何时自动删除,这可能不会有帮助,但我想知道。谢谢!)
最佳答案
除了两件事之外,您的 C++ 看起来走在正确的轨道上。第一,您必须在某处定义 CollectedData 结构的形式,第二,您必须为结构变量命名:
例如,如果您像这样定义 CollectedData 结构
struct CollectedData {
int field1;
std::string field2;
bool field3;
// etc
};
然后在你的内部循环中你可以这样做
while( getline(myFile, line) ) {
CollectedData lineData;
//add property values
lineData.field1 = /*whatever*/;
lineData.field2 = /*whatever*/;
lineData.field3 = /*whatever*/;
//add struct to struct list
AllData.push_back(lineData);
}
每次循环都会创建一个新的 CollectedData 对象,并填充其字段,然后将其拷贝 插入 AllData 列表,最后自动销毁该对象 (请记住列表中仍然存在一个拷贝)。
关于何时销毁对象的详细信息
C++ 有三种存储类型:静态、自动和动态。
静态存储对象在程序的整个生命周期内都存在。在类或函数之外创建的任何对象都是静态的(即全局变量是静态的)。这同样适用于在类或函数中使用“static”关键字声明的任何内容。
动态存储对象是使用关键字“new”创建的对象(或使用 malloc(),但这是一种 C 主义,通常应在 C++ 中避免,除非确实有必要)。动态存储对象是其生命周期由程序员手动管理的对象。动态存储的对象将继续存在,直到您使用关键字“delete”将其销毁。请注意,访问动态存储对象的唯一方式是通过指针或引用。如果您不使用指针或引用,则它不是动态的(但指针/引用也可以引用非动态对象)。
自动存储对象是您的常规变量:结构和类的成员变量,以及方法和函数中的局部变量(包括参数)。
定义在函数内部的自动存储对象是在运行定义它们的代码行时创建的。当它们“超出范围”时,即当它们在其中声明的 block 终止时,它们会自动销毁。通常,“ block ”是一组花括号:{}。因此,在函数返回时,在函数内部创建的任何内容都会在函数返回时销毁,同样,在 while 循环体内创建的任何内容都会在循环结束时自动销毁(无论它是终止还是再次迭代)。
定义为类或结构成员的自动存储对象在创建包含它们作为成员的对象时创建,并在销毁包含它们作为成员的对象时销毁。
(我在上面反复使用了术语“对象”,但相同的规则适用于基本类型,如 int、char、bool 等)
关于C++ 在循环中创建和收集结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1355342/