Ask Your Question
0

Dědění a polymorfismus

asked 2015-05-15 00:15:57 +0100

Petr Gondek gravatar image

Mam třídy:

class Matrix {
public:
      Matrix operator+(const Matrix & secondMatrix) const;
}

a

class RegularMatrix : public Matrix ...

Jestli tomu dobře rozumím, tak operator+ má funguvat tak, že vytvoří nový objekt, sečte *this a secondMatrix a výsledek uloží do nově vytvořeného objektu, který vrátí.

Napadlo mě, že matice se sčítají všechny stejně, ať už je regulární nebo ne. Jenže co mám vracet? Když vrátím Matrix *, tak mi při operaci a = b + c + d; nastane memleak, protože při operaci b+c vytvořím na haldě objekt, kterej nikdo neuvolní. Vracet Matrix & nelze protože nemůžu vracet referenci na dočasný objekt a když vrátím Matrix, tak mi to při sčítání RegularMatrix a RegularMatrix vrací pouze Matrix. To je také špatně, protože přijdu o metody determinantu a inverze.

Jediné řešení, které mě napadlo, je napsat vlastní operator+ pro RegularMatrix, který bohužel bude obsahovat stejný kód, ale s jinou návratovou hodnotou.

Jaké řešení je správné?

edit retag flag offensive close delete

1 Answer

Sort by » oldest newest most voted
1

answered 2015-05-15 10:56:30 +0100

Ondřej Máca gravatar image

updated 2015-05-15 11:08:15 +0100

Nevím jestli je to nejvhodnější, ale já bych to udělal asi nějak takhle:

  class RegularMatrix : public Matrix{
      public:
         RegularMatrix operator+(const RegularMatrix &  secondMatrix) const{
             Matrix tmp = (Matrix)*this + secondMatrix;
             return RegularMatrix(tmp...);     
         }
 };

Sečetl bych matice pomocí operátoru rodičovské třídy a pak bych zkopíroval členské proměnné. Což by při vhodné práci s ukazateli nemuselo stát v podstatě nic.

edit flag offensive delete publish link more

Comments

Doufám že se jim to bude líbit v semestrálce, protože tam hlavně chtějí hledět na dodržení konvencí.

Petr Gondek ( 2015-05-16 11:54:11 +0100 )edit
1

Aha, tak to nevím. Druhá možnost je udělat si na matici zvlášť strukturu, která by byla členskými proměnou ve třídě Matrix (a tedy i RegularMatrix) udělal by si ji operator+ a v těch dvou zmíněných třídách by si ho akorát zavolal

Ondřej Máca ( 2015-05-16 21:58:51 +0100 )edit

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: 2015-05-15 00:15:57 +0100

Seen: 222 times

Last updated: May 15 '15