gpt4 book ai didi

c++结合使用成员函数和重载运算符来过滤传递给流的数据

转载 作者:行者123 更新时间:2023-11-28 08:24:00 26 4
gpt4 key购买 nike

我有一个复杂的对象嵌套层次结构,我需要在输出时对其进行过滤,这样只有满足特定条件的对象才会写入文件。

假设我有一个类 A,它包含一个对象 B 的 STL vector 数组,其中每个对象 B 包含一个对象 C 的 STL vector 数组。

现在所有聪明的事情都已经完成,过滤后的结果需要写入文件:

class A
{
...
std::vector<B> bArray;
std::ostream & filterA(std::ostream &out, int param1,int param2, bool param3)
{
if (param1>0)
{
for (intcurB=0;curB!=bArray.size();curB++)
{
out << bArray.at(curB).filterB(param2,param3);
}
else if (param1<=0) out << "";
return out;
}
};

class B
{
std::vector<C> cArray; std::ostream & filterB(std::ostream &out, int param2, bool param3)
{
if (param2<0)
{
for (int curC=0;curC!=cArray.size();curC++)
{
out << cArray.at(curC);
}
}
else if (param2>0) out << "";
else if(param3) out << "\nInvalid object\n";
else out << "";
return out;
}
};

class C {
bool isSet;

std::vector<int> intArray;
... };

std::ostream & operator <<(std::ostream & out, C &c)
{
if(c.isSet)
{
for (int curInt=0;curInt!=intArray.size();curInt++)
{
out << c.intArray.at(curInt) << " ";
}
out << "\n";
}

else if (!c.isSet) out << "";
return out;
}

int main()
{
A aObject;
....
// Now lets write filtered objects to file
std::ofstream outputFile("/home/user/test.txt");
if (outputFile.is_open())
{
outputFile << aObject.filterA(outputFile,1,-1,false);
outputFile.close();
}

return 0;
}

代码可以运行,即可以编译和运行,但 ostream 对象的地址也被写入文件!

我的问题是

  1. 通用方法是否可取?
  2. 是否有更好的解决方案(可能使用特征)?

最佳答案

您在寻找代码审查吗?

有几件事我会在那里纠正。

  1. 除了为 B 的数组打印格式化程序之外,A 是否还有其他用途? B是否过着自己的存在。如果是这样,让 A 持有对 B 的 vector 的 const 引用,而不是复制它。

类似于 B 作为 C 的集合,尽管这里它必须是指向 vector 的指针而不是引用,因为 B 必须可分配以位于 vector 中(与 A 不同,A 本身不是 vector 元素)。

您可以使用算法来循环或 BOOST_FOREACH。无论如何,您的循环结构都不是最好的。使用迭代器稍微好一点。如果您使用索引,则 size_t 或 vector::size_type 作为索引。最好在循环外或 for 的第一部分计算 size()

for( std::vector<B>::size_type i = 0, len = v.size(); i != len; ++i )

不要使用 at()。你知道你的索引没有越界。如果必须使用此构造,请首选 operator[]。

filterA 和 filterB 都没有修改它们的类,因此使它们成为 const 成员函数。

流空字符串只是毫无意义的代码。如果您有一个可能为空但 os << "" 的字符串变量,这是一回事一事无成。

关于c++结合使用成员函数和重载运算符来过滤传递给流的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4722237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com