2012-09-22 35 views
0

主要工作中的线可以吗?也许其他运营商?一些建议? 我认为这里的操作顺序是问题。是否必须使用b.addA(“P”); b.R( “P”)REF(b.R( “P”)); ?访问班级成员的C++操作顺序

我想将对象的引用添加到其他对象,并在对象之间建立关系,如数据库模型。

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

(其中包括)我认为这是错误的:'_as。的push_back(A :: A(nm)的);'。也许你的意思是'_as.push_back(A(nm));' –

+0

@MihaiTodor:我认为这很好,因为我想存储在我的A型矢量中,名为_as我的“子对象” –

+0

你不能/不应该直接调用类的构造函数,即使VS2010似乎允许它。纠正这一点后,我仍然在GCC中遇到一个奇怪的错误,但我不知道为什么。 –

回答

2

可在主要的工作线?

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

但是,您的代码存在问题。这是成员函数B::A。在类B的范围内,这将A的含义从class A更改为成员函数B::A(std::string)。你的代码无法在多个编译器上编译,但它在编译时使用了clang 3.1。 这看起来像是一个叮当声虫。 附录:这与clang编译是可以的,因为违反的规则是那些讨厌的“不需要诊断”规则之一。)你的代码是非法的;它(理想情况下)应该不能编译。

该功能的更好名称是findA。该名称不会与类名冲突,并且会使代码自行记录。

旁白:您可能想要让该函数返回一个指针而不是参考。例外情况应该用于例外事件(即错误)。事实是(例如)“Foo”在您的向量中没有真正值得抛出异常?

+0

更改A&B :: A(标准偏差::字符串)为A&B :: R(标准偏差::字符串),问题仍然存在... :( –

+0

它也编译VS2010,但它仍然[非法] (http://stackoverflow.com/a/12187709/1174378)。 –

+0

我想返回引用来编写链式指令,就像在缅因州。 –

0

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

A'.ref(A “)

其中A” A” 由两个不同的FN B级返回被引用的对象(bydway在这种情况下A'A“将是相同的)。

上述呼叫将通过参考返回类A的另一目的,其可以分配到的像

甲吨任何其他实例; 吨= b.addA(“P”)REF(BR(。 “P”));

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

+0

问题是,首先调用bR(“P”)如果我在类之间创建友谊并使ref(std :: string)通过pointe r到b它有想要的结果。更详细的说,在AI中可以有B * _myb并且在ref(std :: string nm)_myb-> R(nm)中调用以找到类型A的对象并将其添加到ref中,那么对ref的调用将会像b.addA( “P”)。REF( “P”)。这工作。 –