49810


派生クラスのインスタンスに関数の戻り値で持ってきた規定クラスのインスタンス？  
を代入させていのですが、エラーが出てしまい対処に困ています、  
ユーザー定義変換とはなんでしょうか？初学者のため初歩的なことかもしれませんが  
教えてくれますでしょうか？

[code]

      ////////////////source.cpp部(header.h部は宣言しかしてないので記載しません)///
            #include "conio.h"
            #include <sstream>
            #include "Header.h"
            #include <iostream>
    
            void C::view()const
            {
                cout << "name: " << name << "\n";
                cout << "要素数: " << num << "\n";
    
                for (int i = 0; i < num; i++)
                {
                    cout << " [" << i << "]: "<<vec[i]<<endl;
                }
    
    
            cout << "\n\n";
            }
    
            /*コンストラクタ*/
            C::C(int x = 0, string n = "no name") : num(x), vec(new int[x]), name(n)
            {
    
                for (int i = 0; i < num; i++)
                {
    
                    vec[i] = i + 1;
                }
            }
    
            /*コピoperator*/
            C::C(const C& x)
            {
                cout << "コピーコンストラクタ\n";
                if(this == &x)
                {
                    num = 0;
                    vec = NULL;
                }
                else {
                    cout << "コピー\n";
    
                    num = x.num;
                    vec = new int[num];
                    for (int i = 0; i < num; i++)
                    {
                        vec[i] = x.vec[i];
                    }
                }
            }
    
            /*代入コンストラクタ*/
            C& C::operator = (const C& z)
            {
                cout << "代入operator\n";
    
                if (this != &z)
                {
                    if (num != z.num)
                    {
    
                        //cout << "代入\n";
                        delete[] vec;
                        num = z.num;
                        name = z.name;
                        vec = new int[num];
    
                    }
    
                    for (int i = 0; i < num; i++)
                    {
                        vec[i] = z.vec[i];
                    }
    
                }
    
                return *this;
            }
    
    
    
            /*ostream&*/
            string C::to_string()const
            {
                ostringstream os;
                os << "name: " << name<<"\n";
                os << "要素数: " << num << "\n";
                for(int i = 0; i<num; i++)
                {
                    os << " [" << i << "]: " << vec[i]<<"\n";
                }
                os << "\n\n\n";
                return os.str();
            }
    
            bool C::operator > (const C& x)
            {
                cout << "operator > \n";
                if (num > x.num)
                {
                    return true;
                }
                else {
                    return false;
                }
    
            }
    
            bool C::operator <(const C& x)
            {
                if (num < x.num)
                {
                    return true;
                }
                else {
                    return false;
                }
            }
    
            ostream& operator <<(ostream& os, C& x)
            {
                os << x.to_string();
    
                return os;
            }
    
    
            /*Cクラスの派生クラスD_C*/
            D_C::D_C(int a = 0, string na = "no name[]",
                                                    int nn = 0,string na2 = "no name[][]")
                :num(a),name(na),vec(new int[a]),C(nn,na2){
    
                //cout << nn<<"\n";
                for (int j = 0; j < num; j++)
                {
                    vec[j] = j+1;
                }
    
    
            }
    
            string D_C::to_string()const
            {
                stringstream os;
    
                //os << "\n";
    
    
                os << "C: " << C::num << " : " << C::name << "\n";
                for (int i = 0; i < C::num; i++)
                {
                    os << " [" << i << "]: " << C::vec[i] << "\n";
                }
    
                os << "D_C: " << num << " : " << name << "\n";
    
                for (int i = 0; i < num; i++)
                {
                    os << " [" << i << "]: " << vec[i] << "\n";
                }
    
                os << "\n\n";
    
                return os.str();
            }
    
            ostream& operator<<(ostream& os, D_C& x)
            {
                os << x.to_string();
    
                return os;
            }
    
            void D_C::view()
            {
    
    
            //  size_t t1 = sizeof(C::vec) / sizeof(C::vec[0]);
            //  size_t t2 = sizeof(vec) / sizeof(vec[0]);
    
                cout << "要素数C: " << C::num<<"\n";
    
                for (int i = 0; i < C::num; i++)
                {
                    cout << " [" << i << "]: " << C::vec[i] << "\n";
                }
                cout << "\n\n";
    
    
                cout << "要素数D_C: " << num << "\n";
                for (int i = 0; i < num; i++)
                {
                    cout << " [" << i << "]: " << vec[i] << "\n";
                }
    
                cout << "\n";
    
    
            }
    
    
    
    
    
       ////////////////int main部////////////////////////
    
            #include "Header.h"
            using namespace std;
    
    
            D_C f()
            {
    
                return  D_C(3,"function",6,"D_C f");
            }
    
            C ff()
            {
    
                return  C(7,"function ff");
            }
    
    
            int main() {
    
                D_C x(1,"Dc",2,"DC");
    
                D_C d = ff();//適切のユーザー定義変換が存在しません。
                d.view();
    
    
    
    
    
                _getch();
                return 0;
            }
    
[/code]


CC BY-SA 4.0
2018-10-30T13:07:51.630
49804
2018-10-31T07:01:07.110
2018-10-31T07:01:07.110
2238
question
c++
派生クラスに基底クラスを代入させたい。


派生クラスインスタンスに基底クラスインスタンスを代入することに一般的な意味が無いから、ユーザー定義変換を使って（作って）意味づけしろ、ということです。例

[code]

    class 人間 { メンバとして生年月日や性別や住所氏名があるだろう };
    class 従業員 : public 人間 { メンバとして役職や基本給があるだろう };
    
    従業員 部長;
    人間 馬の骨;
    部長 = 馬の骨; // これって何がしたいの？
    
[/code]

派生クラスインスタンスである `部長` に、基底クラスインスタンスである `馬の骨` を代入することって、一体何がしたいんでしょうか？
現部長を馘首にして馬の骨を新しい部長に任命する？ そのときの役職や基本給はどうしたいんですか？ そのまま据え置きでいいんですか？
周りのみんなは納得するんですか？

といったわけで、この場合、代入するってこと自体が無茶ぶりです。「ユーザー定義変換関数」を作るというのは、社長命令鶴の一声で皆を納得させるような手続きを明確にするってことです。

提示例で「Q:どうすればいい」に対しては「A:どうしたいのか自分で決めてね」自分で決めらられないのであれば、それは案件が整理できていない＝まだ「仕様」にまで落とし込めていないってことで、プログラム以前の話ですね。

技術論だけ言うなら `D_C& D_C::operator=(const C&) { ... }` を実装することになるでしょうか。


CC BY-SA 4.0
2018-10-30T23:41:04.417
49810
2018-10-30T23:51:53.290
2018-10-30T23:51:53.290
8589
8589
49804
answer