0

主线可以工作吗?也许其他运营商?一些建议?我认为操作顺序是这里的问题。是否必须使用 b.addA("P"); bR("P").ref(bR("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;
}
4

2 回答 2

2

主线可以工作吗?

当然。这里只有两个运算符,函数调用和引用(点运算符)。如果关联是从右到左的,或者函数调用优先于引用,则会出现问题。事实并非如此。函数调用和引用具有相同的优先级,并且关联是从左到右的。这正是你想要的。

但是,您的代码有问题。这是成员函数B::A。在类的上下文中B,这改变了Afromclass A到成员函数的含义B::A(std::string)。您的代码无法在多个编译器上为我编译,但它确实使用 clang 3.1 编译。对我来说,这看起来像是一个铿锵虫。附录:这确实用clang编译是可以的,因为被违反的规则是那些讨厌的“不需要诊断”规则之一。)你的代码是非法的;它(理想情况下)应该无法编译。

该函数的更好名称是findA. 此名称不会与类名冲突,它会使代码自我记录。

旁白:您可能想考虑让该函数返回指针而不是引用。异常应该用于异常事件(即错误)。(例如)“Foo”在您的向量中没有表示的事实是否真的值得抛出异常?

于 2012-09-22T12:29:42.173 回答
0

从 main 中的行开始肯定会起作用。现在这是如何发生的,是您感兴趣的问题吗?当您调用 addA("P") 时,它会创建类 A 的对象并通过引用返回它,现在 A 的此对象调用其成员 fn ref(A&),如您所见,您需要通过通过调用 bR("P") 来引用这个函数,它本身返回对刚刚添加的带有字符串“P”的对象的引用。现在你有

A'.ref(A")

其中 A' A" 是由 B 类的两个不同 fn 返回的引用对象(顺便说一句,在这种情况下 A'A" 将是相同的)。

上面的调用将通过引用返回 A 类的另一个对象,您可以将其分配给 A 的任何其他实例,例如

在; t = b.addA("P").ref(bR("P"));

您只是在进行链式函数调用,并通过引用返回对象来确保您可能会丢失的临时变量中没有任何事情发生。希望我已经回答了你的问题。

于 2012-09-22T15:02:04.757 回答