質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

2回答

574閲覧

C++をやっている人がC#を触ったときに間違えてしまうようなことはありますか

piced

総合スコア60

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

1クリップ

投稿2021/11/23 12:52

#質問した経緯
DirectXでC++になれてきた後にUnityを触ったのですが、
参照型(int&)やポインタ(int*)の変数がつくれなかったり、
classではコピーができなかったりで驚きました。

もちろん調べればいいだけの話ですが、ミスする/問題が発覚するまで気づけなくて、
かつ知りたいことをピンポイントで調べられないので今後が不安です。

#質問
そこで、やや曖昧な質問にはなりますが、
C++をやっている人がC#を触ったときに間違えてしまうようなことはありますか。
(正確には、DirectXを触る感覚でUnityに触ると間違えるであろうことを教えていただきたいです。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/11/23 13:53

全然違う言語なので、最初から学ぶのがいいでしょう。 そもそもメモリ管理の方法からライブラリの使い方からまるで違います。
guest

回答2

0

ベストアンサー

実務でC++(cocos2d-x)とC#(Unity)を使ったアプリを並行して開発・運用していますが混乱はしません。
そもそもまったく違う言語なので、混同しようがありません。
C#、C++を学ぶ順番はどっちでもいいのですが、新しい言語を学ぶ時はこれまでの知識はいったん忘れて最初からきちんと学ぶほうがいいです。
変数名やメソッド名などの命名規則も違いますからそれぞれの言語の作法に従うほうがいいです。
もし、混乱してしまうようであれば、C++ではこうだったとかいうのは忘れたほうがいいでしょう。

投稿2021/11/23 14:21

mingos

総合スコア4207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piced

2021/11/23 17:51

根本的に違う言語なのにC++とC#を 「似た部分とその違い」という視点からC#を学んでしまうと、 C++にはないC#だけの機能やルール、仕様などを知る機会がほぼ無くなってしまうと気づきました。 他の方も教えてくれたように、大人しく最初から勉強しようと思います。 ありがとうございました。
guest

0

C++ → C# の順に触った者です.
「別の言語だからC++のことは忘れろ」みたいな話は尤もなのですが,どうしても「あっちだとこうだったんだけど,こっちだとどうなん…?」とかなっちゃいますよね(私だけか?).

C++をやっている人がC#を触ったときに間違えてしまうようなことはありますか。

例えば,ラムダ式とか今でも間違う…というかわりと混乱します.
記述として C++ だと -> で,C#だと => とか.
あとキャプチャした変数の値として「いつの時点での値が用いられるのか」も違ったりとか.

あと,C++で shared_ptr とか触ってると循環参照の問題とかが頭をよぎりますが,
C# の GC はそういう話ではないらしい(参照カウンタ方式ではない)みたいな話とかも最初はよくわからなかったりしました.
(「参照されなくなったら勝手にどうの…」という曖昧な説明に出くわすと「参照されなくなった,とは何か? どういう状況か?」っていう)

投稿2021/11/24 01:12

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/11/24 01:26 編集

あと,C#だと抽象メソッドとかをprivateで書けないとかもコンパイルエラー出て「は?」ってなりますね.
退会済みユーザー

退会済みユーザー

2021/11/24 02:02 編集

privateの抽象メソッドってどういう時に使うものですか? privateだと継承先で参照出来ないので、書けたとしても抽象メソッドにする意味がなさそうな気もしますが。
fana

2021/11/24 02:11 編集

C++だとこんな感じのをprivateで書けるので,C++を先にやってたおかげでC#でもprivateって書いちゃってコンパイラに怒られる…という話です. (以下では,インデントをアンダーバーにしてあります) class Base { public: __void F(){ G(); } //Template Method パターンみたいな. private: //G()はprivateでおk __virtual void G() = 0; }; class Deriv : public Base { private: __virtual void G() override { std::cout << "Deriv::G()\n"; } };
退会済みユーザー

退会済みユーザー

2021/11/24 02:27

C++だと継承出来ちゃうんですね。 外に見せたくないものがprivate、と思っていたので、なんかカルチャーショックが。
fana

2021/11/24 02:52 編集

C#で同じような書き方をする場合,おそらくメソッドGをprotectedにしなければなりませんが, protected とは「publicではないが,継承先では自由に使って良いぞ」という意味です(と私は考えています). しかし,このメソッドGとは,Base::F() の処理の流れの中で呼ばれることが前提の(専用の)物であり,唐突に単独でコールして使って良い性質のものではありません.(←っていうのが Base の立場でのメソッドGの定義) なので,継承先のクラスが用いることができてしまう形(つまりprotected)でメソッドGを定義することは「間違い」だと思うのです. (が,C#だと private にできないっていう)
fana

2021/11/24 02:37

> C#で同じような書き方をする場合 まぁ,そもそも そんなことをしなければよい(他の書き方でやれ) という話かもしれませんが.
退会済みユーザー

退会済みユーザー

2021/11/24 02:54 編集

C#で単独で呼ばせたくないという場合は、外から注入する作り(イベントハンドラ的な)になるかな…
fana

2021/11/24 03:01 編集

そうですね. 実際問題として「あるタイミングで使うから,その具体実装を与えろ」というのを書く場合に,その実装手段として継承を用いるか? っていうと,まぁやらないです^^. 外から突っ込みますね( "DI" とか呼ぶのかな?). --- #しかし,自分自身,以前はC++でそういうのを継承で書いてたこともあったわけで,何故「まぁやらないです」っていう感覚(?)になってるのか…?
Zuishin

2021/11/24 03:01 編集

継承した時点で使えてしまうのでは? C# なら abstract もつけるでしょうね。
fana

2021/11/24 03:03

> 継承した時点で使えてしまうのでは? class Deriv2 : public Deriv { public: __void SomeProc(){ G(); } //Gはprivateなのでコンパイルエラーです }
Zuishin

2021/11/24 03:04

G() をオーバーライドしてもコンパイルエラーになるんですか?
fana

2021/11/24 03:13

Deriv2自身がオーバーライドしたならばDeriv2自身はそれ(Deriv2::G())を(呼びたければ)呼べるでしょうけど, それは通常の private メソッドと同じ話ですね. 親側の実装( Deriv::G() )を呼べるか否か,という点が protected と private の違いかと.
Zuishin

2021/11/24 03:34

深い継承をする時に違いが出てくるということですね? C# で強いて近いものを求めるとするなら、セッターオンリーのプロパティにデリゲートを入れるくらいでしょうか。
Zuishin

2021/11/24 03:42

こんな感じで。 class BaseClass { protected Action? G { private get; set; } public void F() => G?.Invoke(); } class DerivedClass : BaseClass { public DerivedClass() => G = () => Console.WriteLine("Hello World!"); }
fana

2021/11/24 03:58

> 深い継承をする時に違いが出てくるということですね? そうですね. 私は C# をそんなに触ってない初心者なので,提示いただいたコード例の側に関しては,「そんな文法が…!」状態ですが^^. (Action ではなく Action? とする理由も理解できず)
Zuishin

2021/11/24 04:08 編集

Action? は null 許容参照型を有効にした場合です。 .NET 6.0 からのテンプレートではデフォルトで有効になっています。 それ以前のテンプレートでは #nullable ディレクティブを使うか、.csproj を書き換えることで有効になります。 https://ufcpp.net/study/csharp/resource/nullablereferencetype/ 次のコードと同義です。 #nullable disable class BaseClass { protected Action G { private get; set; } public void F() { if (G != null) { G(); } } } class DerivedClass : BaseClass { public DerivedClass() { G = (Action)(() => Console.WriteLine("Hello World!")); } }
fana

2021/11/24 06:06

> null 許容参照型 ご教示いただき感謝です.
Zuishin

2021/11/24 08:17

こちらこそありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問