2010-06-18 58 views
1

我的問題很簡單,但我被卡住了。我如何從基類中選擇所需的構造函數?繼承和從基類中選擇構造函數

// node.h 
#ifndef NODE_H 
#define NODE_H 

#include <vector> 

// definition of an exception-class 
class WrongBoundsException 
{ 
}; 

class Node 
{ 
    public: 
     ... 

     Node(double, double, std::vector<double>&) throw (WrongBoundsException); 
     ... 
}; 

#endif 


// InternalNode.h 
#ifndef INTERNALNODE_H 
#define INTERNALNODE_H 

#include <vector> 
#include "Node.h" 


class InternalNode : public Node 
{ 
    public: 
     // the position of the leftmost child (child left) 
     int left_child; 
     // the position of the parent 
     int parent; 

     InternalNode(double, double, std::vector<double>&, int parent, int left_child) throw (WrongBoundsException); 

    private: 
     int abcd; 

}; 

#endif 


// InternalNode.cpp 

#include "InternalNode.h" 

#define UNDEFINED_CHILD -1 
#define ROOT -1 


// Here is the problem 
InternalNode::InternalNode(double a, double b, std::vector<double> &v, int par, int lc) 
throw (WrongBoundsException) 
: Node(a, b, v), parent(par), left_child(lc) 
{ 
    std::cout << par << std::endl; 
} 

我得到:

$ g++ InternalNode.cpp 

InternalNode.cpp:16:錯誤:的「InternalNode :: InternalNode(雙,雙,性病::矢量> &,INT,INT)拋出聲明( WrongBoundsException)」引發不同的異常 InternalNode.h:17:錯誤:從先前聲明 'InternalNode :: InternalNode(雙,雙,性病::矢量> &,INT,INT)'

UPDATE 0:固定丟失:

更新1:固定拋出異常

+0

你在'std:endl'中有一個冒號,它應該是一個雙冒號。 – sharptooth 2010-06-18 10:52:20

+1

錯誤說你沒有修復缺少的異常規範。順便說一句,看看[務實查看例外規格](http://www.gotw.ca/publications/mill22.htm)。 – 2010-06-18 11:02:25

回答

2

這種簡化的代碼編譯正確,但缺少監守構造定義不鏈接以基地等級:

#include <vector> 

// definition of an exception-class 
class WrongBoundsException { 
}; 

class Node { 
    public: 
     Node(double, double, std::vector<double>&) 
       throw (WrongBoundsException); 
}; 

class InternalNode : public Node { 
    public: 
     // the position of the leftmost child (child left) 
     int left_child; 
     // the position of the parent 
     int parent; 

     InternalNode(double, double, std::vector<double>&, 
         int parent, int left_child) 
         throw (WrongBoundsException); 
    private: 
     int abcd; 

}; 

// Note added exception specification 
InternalNode::InternalNode(double a, double b, 
          std::vector<double> &v, 
        int par, int lc) throw (WrongBoundsException) 
     : Node(a, b, v), parent(par), left_child(lc) 
{ 
} 

順便說一句,你爲什麼覺得有必要使用異常規格?它們通常在C++中看起來有點浪費時間。

+0

感謝您的建議。我不再使用例外。 – 2010-06-18 11:54:40

+1

@myle:例外情況很好。它的「例外規格」也是Neil所指的。 – 2010-06-18 12:09:11

+1

@myle是的 - 您需要例外,特別是報告施工錯誤,只是不使用規格。 – 2010-06-18 12:58:05

1

你缺少的構造函數定義異常規範:

InternalNode::InternalNode(double a, double b, std::vector<double> &v, int par, int lc) 
    throw (WrongBoundsException) 
    : Node(a, b, v), parent(par), left_child(lc) 
{ 
    std::cout << par << std::endl; 
}