main里的线能行吗?也许其他运营商?一些建议? 我认为操作顺序是这里的问题。是否必须使用 b.addA("P"); b.R("P").ref(b.R("P")); ?
我想将一个对象的引用添加到其他对象并在对象之间建立关系,例如数据库模型。
#include <iostream>
#include <vector>
#include <string>
class A;
class B;
class A{
std::string _name;
std::vector<A*> _refs;
public:
A(std::string="");
A& ref(A&);
std::string name() const;
};
class B{
std::string _name;
std::vector<A> _as;
public:
B(std::string="");
A& addA(std::string);
A& R(std::string);
};
A::A(std::string nm){
_name=nm;
}
A& A::ref(A &a){
for(int i=0; i<_refs.size(); i++)
if(_refs[i]==&a)
return a;
_refs.push_back(&a);
return a;
}
std::string A::name() const{
return _name;
}
B::B(std::string nm){
_name=nm;
}
A& B::addA(std::string nm){
for(int i=0; i<_as.size(); i++)
if(_as[i].name()==nm)
return _as[i];
_as.push_back(A(nm));
return _as[_as.size()-1];
}
A& B::R(std::string nm){
for(int i=0; i<_as.size(); i++)
if(_as[i].name()==nm)
return _as[i];
throw std::string("invaild A");
}
int main(){
B b;
b.addA("P").ref(b.R("P"));
return 0;
}
最佳答案
Can the line in main work?
当然。这里只有两个运算符在起作用,函数调用和引用(点运算符)。如果关联是从右到左,或者函数调用优先于引用,你就会遇到问题。事实并非如此。函数调用和引用具有相同的优先级,关联是从左到右的。这正是您想要的。
但是,您的代码存在问题。它是成员函数 B::A
。在类 B
的上下文中,这将 A
的含义从 class A
更改为成员函数 B::A(std: :字符串)
。你的代码无法在我的多个编译器上编译,但它确实使用 clang 3.1 编译。 对我来说这看起来像是一个 clang 错误。(附录: 这确实可以用 clang 编译是可以的,因为被违反的规则是那些令人讨厌的规则之一“没有诊断是required”规则。)你的代码是非法的;它(理想情况下)应该无法编译。
该函数更好的名称是 findA
。此名称不会与类名冲突,并且可以使代码 self 记录。
旁白:您可能想要让该函数返回一个指针而不是一个引用。异常应该用于异常事件(即错误)。事实上(例如)“Foo”没有在你的 vector 中表示真的值得抛出异常吗?
关于C++ 访问类成员的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543494/