2016-04-28 2 views
0

У меня проблема с использованием static_cast. Вот моя программа:C++ дает мне ошибку: нет соответствия для вызова

#include <iostream> 
using namespace std; 

class Mtx { // base matrix 
private: 
    // refer to derived class 
    Mtx& ReferToDerived() { 
     return static_cast<Mtx&>(*this); 
    } 
    // entry() uses features of derived class 
    virtual double& entry(int i, int j){ 
    return ReferToDerived() (i,j); // error appears here 
    } 
protected: 
    int dimn; // dimension of matrix 
public: 
    // define common functionality in base class that can 
    // be called on derived classes 
    double sum() { // sum all entries 
     double d = 0; 
     for (int i = 0; i < dimn; i++) 
      for (int j = 0; j < dimn; j++) d += entry(i,j); 
     return d; 
    } 
}; 

class FullMtx: public Mtx { 
    double** mx; 
public : 
    FullMtx(int n) { 
     dimn = n; 
     mx = new double* [dimn] ; 
     for (int i=0; i<dimn; i++) mx[i] = new double [dimn]; 
     for (int i=0; i<dimn; i++) 
      for (int j=0; j<dimn; j++) 
       mx[i][j] = 0; // initialization 
    } 
    double& operator() (int i, int j) { return mx[i] [j]; } 
}; 

class SymmetricMtx : public Mtx { 
    // store only lower triangular part to save memory 
    double** mx ; 
public : 
    SymmetricMtx(int n) { 
     dimn = n; 
     mx = new double* [dimn]; 
     for (int i=0; i<dimn; i++) mx[i] = new double [i+1]; 
     for (int i=0; i<dimn; i++) 
      for (int j=0; j <= i; j++) 
       mx[i][j] = 0; // initialization 
    } 
    double& operator() (int i, int j) { 
     if (i >= j) return mx[i][j] ; 
     else return mx[j][i]; // due to symmetry 
    } 
}; 

int main() 
{ 
    FullMtx A(1000); 
    for (int i=0; i<1000; i++) 
     for (int j=0; j<1000; j++) 
     A(i,j)=1; 
    cout << "sum of full matrix A = " << A.sum() << '\n'; 

    SymmetricMtx S(1000); // just assign lower triangular part 
    for (int i=0; i<1000; i++) 
     for (int j=0; j<1000; j++) 
     S(i,j)=1; 
    cout << "sum of symmetric matrix S = " << S.sum() << '\n'; 
} 

Когда я бегу, он говорит: не подходит для вызова «(MTX) (INT &, внутр &)» И я не понимаю, что это не так, и как я должен изменить его? Он должен быть написан с использованием виртуальных функций, но я не знаю, как я могу написать его правильно. Кто-нибудь может мне помочь? Эта программа должна рассчитывать сумму всех элементов FullMatrix и SymmetricMatrix.

+0

'return static_cast (* this);' не имеет никакого смысла. –

+0

почему нет? то как мне его изменить? – Caboom

+0

@Paula Это эквивалентно 'return * this;'. Неясно, чего вы ожидаете от этого. – molbdnilo

ответ

0

удалить виртуальный здесь

virtual double& entry(int i, int j){ 
    return (*this)() (i,j); // error appears here 
} 

добавить виртуальный там

class Mtx { 
... 
    virtual double& operator() (int i, int j) = 0; 
} 

пусть производные классы от перегрузки, что оператор и voala.

class FullMtx: public Mtx { 
    ... 
    virtual double& operator() (int i, int j) override { return mx[i] [j]; } 
} 

также это просто вздор, как уже указывалось. вы бросаете тот же тип, а не полученный. кроме того, что вы не можете наложить на производный тип, потому что в базе у вас нет информации о полном наследовании - что, если кто-то из вас получит FullMtx без вашего ведома?

Mtx& ReferToDerived() { 
    return static_cast<Mtx&>(*this); 
} 
+0

_ "и voala" _ Это новый –

+0

Я добавил и удалил те виртуальные, как вы сказали. Но в класс Mtx { ... virtual double & operator() (int i, int j) = 0; } Я получаю ошибки, которые говорят: «Виртуальное» объявление внешнего класса »и « «double & operator() (int, int)» должно быть нестатической функцией-членом ». – Caboom

Смежные вопросы