• ベストアンサー

C++ Builderでのnewコマンドについて

ファイルのコピーの際に利用する TStringList、TStringsについてお聞きしたいのですが、 TStringList *ABC = new TStringList; TStrings *DEF = new TStringList; 上記のように宣言し、 ABC->コンポーネント1、DEF->コンポーネント2のように 使うのですが、両方とも上記宣言の右辺がなぜこのように なるのでしょうか?なぜ2番目の宣言は左辺にTStringsと 記載していて右辺がTStringListなのでしょうか? そもそもここで記載しているnewの意図や 通常のC言語のポインタの宣言とどう違うのかが 掴めません。どうか初心者でもわかるように 教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Rulurulu
  • ベストアンサー率47% (8/17)
回答No.2

簡単に説明するとTStringListはTStringsから派生したクラスなので TStrings型のポインタは、TStringList型も持つことができます。 >>newの意図 TStringListなどのVCLのクラスを使うには、Builderではポインタとして操作し newでオブジェクトを作成しなければならない決まりになってます。 (これはDelphiの影響のため) ですが、正確に理解するためにはNo1の方がおっしゃるとおりC++について 基本から勉強してみる事をお勧めします。 下記のHPなどを参考に読んでみてください。 C++入門 http://wisdom.sakura.ne.jp/programming/cpp/index.html C++ http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html C++Builder http://gimite.ddo.jp/bcbqtree/qtreemain.cgi

参考URL:
http://wisdom.sakura.ne.jp/programming/cpp/index.html
noname#25605
質問者

お礼

ご回答ありがとうございます。 参考になるURLまで教えていただきありがとう ございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

まず、C++の new は、「演算子」です。 これは、つまりは、 a + b の + などと同じ分類になります。 さて、この場合左辺がポインタなので、初期化として、新しいオブジェクトをひとつ作って、そのオブジェクトのポインタを渡しています。 C言語だと、malloc() という「関数」がこれに近い働きをしていました。 ただし、malloc() はただ単に、要求されたサイズのメモリを確保して、その先頭へのポインタを渡すだけです。 これに対して、C++では、「クラス」の機構が導入されたために、「新しいオブジェクト」を作るには、単に、必要なだけメモリを確保するだけではすみません。 新しいオブジェクトを作るために何をすればいいかは、各クラスのコンストラクタで記述します。いずれにしても、メモリを確保したうえで、何らかの初期化処理をすることで、新しいオブジェクトを生成します。 new 演算子は、この、「メモリの確保」+「コンストラクタの実行(による新しいオブジェクトの生成)」をひとまとめにしたものです。

noname#25605
質問者

お礼

ご回答ありがとうございます。 非常にわかりやすく参考になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> 通常のC言語のポインタの宣言とどう違うのかが > 掴めません。 これはC++なので、C言語と異なるのは当然です。 他の質問についても、一度C++の入門書で一通り勉強してから再質問することをお勧めします。 C++はかなりのボリュームがあるので、基本的なことから一通り説明するには、この場は狭すぎます。

noname#25605
質問者

お礼

ご回答ありがとうございます。 jactaさんのおっしゃる通り一から勉強しなおします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語でのレジストリ書き換え

    C言語に於いて以下のことをしようと思うのですが、知識不足故、どうもうまくいきません。 ・プログラム名 -1 とすると、とあるレジストリの値のデータを"100"にする。-2とすると"200"となる。 又、同時に、他の値のデータを"abc def 1"にする。-2とすると"abc def 2"となる。 ・プログラム名 -d とすると、上記の"abc def *"のデータを表示する。 どなたかどうすれば以上のことができるのか教えていただけないでしょうか。

  • C#において、同じインスタンスを何度もnewしてよいでしょうか。

    C#において、同じインスタンスを何度もnewしてよいでしょうか。 (インターネットで探したんですが、意外に見つからなかったもので質問させていただきました。) 例えば A a = new A(); //なにかしら処理 a = new A(); //なにかしら処理 a = new A(); //なにかしら処理 と書いた場合、最初と2番目のnewしたインスタンスは、ガベージコレクタによっていずれ破棄されると考えてよろしいでしょうか。 また上記のコードを A a = new A(); //なにかしら処理 A a = new A(); //なにかしら処理 A a = new A(); //なにかしら処理 のように、宣言から書きなおしている場合では、どのような違いがあるのでしょうか。 よろしくお願いします。

  • C言語のポインタと配列

    どうにも理解しようとしていますが全体像が理解できないので、わかっていることわからないことまとめていくのでバンバン指摘してくださるとうれしいです。 1.配列の宣言には int a[]; a[] = {1,2,3}ですが、コンピュータは{"1","2","3"}の部分の数を数えて[]に代入しているので、 int [][3] = {{1,2,3},{4,5,6}}のような配列を作ったとき[][3]の部分の左側の数字も勝手に代入している。 この時なぜ3が勝手に代入されないかがわからない 2.数字とメモリ int s = {1,2,3}をメモリ的に表現すると、123の順に並んでいる。s[1]=2 int s[][2] = {{1,2,3},{4,5,6}}をメモリ的に表現すると123456に並んでいる。s[1][1]= 5 ここまで文字列以外の配列は添え字だけで管理されている。 3.文字列とポインタ char s[] = "abc"とするとメモリ的にはabc\0であり、[]には4が代入され、s[1]はb自身を指す。 char *s = "abc"をメモリで表すとabc\0であり、\0が来るまでを文字列と認識する。 sは&s[0]とも表現できるように、最初のアドレスを指し示している。 char *s[]= {"abc","def"}をメモリ的に表現するとabc\0def\0であり、[]には2がコンピュータにより判断されて代入される。\0までを文字列として表現しようとする。s [1] は"def"の最初のアドレスを指し示すが、s[1][1]とするとe自身を指すようになる。この時、s[1] = &s[1][0]と表現することは可能であると考えられる。 文字列を直接さす場合でも、ポインタで表現する場合でも、\0が要素の最後に来るのでしょうか? また、{{"abc","def"},{"ghi","jkl"}}を文字列で直接表す場合は char s[2][2] = {{"abc","def"},{"ghi","jkl"}}; となるかと思いますが char *s[2][2] = {{"abc","def"},{"ghi","jkl"}}; とするとs[1][1]でghiの最初のアドレスを、s[1][1][0]でg自身を表せるようになるのでしょうか?

  • コンストラクタでnewを失敗した場合の対応について

    よろしくお願いします。 クラスのメンバで3つのlongのポインタを宣言し、 コンストラクタ内でそれぞれにnewして領域を確保 しています。 質問1)newを失敗した場合には、そのポインタに     対してdeleteしてはいけないのでしょうか? 質問2)上記3つもエリアの確保のうち、2つめで失    敗した場合、1つ目のdeleteをしてやる     必要はあるのでしょうか? catch(bad_alloc)でその処理をしようとおもうのですが、そもそもコンストラクタで例外を発生させるなと かかれている書籍もあるようです。ただ、すでにそういう記載になってしまっており、できれば、いまの構造でメモリーリークを防げないかと思案しております。どなたか、よい方法をご存知の方いらっしゃいましたら、アドバイスいただけましたら幸いでございます。

  • C言語 比較抽出

    C言語 コンソール VC6.0で悩んでいます。 ABC.com ABC.com DEF.co.jp GHI.go.jp DEF.co.jp DEF.co.jp JKL.com JKL.com ABC.com 上記のようなデータがsData[i]にあり、 ABC.com  3回 DEF.co.jp  3回 GHI.go.jp  1回 JKL.com  2回 のように画面に出力したいのですが、表示も処理も一緒だとややこしいので 表示は後回しにして、一度sHost[i]とiNum[i]に格納しようと考えています。 strcmpでの比較をwhileやforで多重ループで回すくらいしか思い付きません。 何か案だけでもいただけないでしょうか。お願いします。

  • 配列とポインタと同時に使用する宣言について

    配列とポインタを同時に使用した場合、どのように確保されるのかイマイチ理解しきれていません。 例えば、 char *pointer[10]; と宣言した場合、 pointer[0]="ABC" pointer[1]="DEF" ・・・・ のようにポインタ型を配列で管理する、という風に認識しています。 一方で char (*pointer)[10] とした場合、どのように確保されるのでしょうか?

  • C言語でのコマンドライン引数の内部での処理のされ方

    C言語でint main(int argc, char *argv[])とメイン関数を宣言します。 2番目の引数はC言語の文法的にいうと文字列へのポインタの配列だとおもいますが、一般的な関数でこの引数に値を渡すとすると、以下のように宣言されたポインタ配列を渡すことになるとおもいます。 ・宣言 char *pa[]; ・関数への渡し func(pa); 話が元に戻りますが、main関数でもらう場合は、プログラム外部から与えられた引数は(正確に言うとアドレス)、メモリ上ではC言語で書かれたexeファイルの外から実行時にプログラムファイルのメモリ上にコピーされるのでしょうか? 自分でもうまく表現できないのですが、 ・コマンドプロンプトで引数を与えて実行         ↓ ・プログラムファイルのメモリ上に引数がロードされる ということでいいんでしょうか? 自分でもなんだかうまく表現できないので、お暇な方でよろしいので、気が向いた人、回答ください。 よろしくお願いします。

  • 特定カラム値が規定値以上になった場合発動するトリガ

    MySQLのトリガについて教えてください。 投票システムを作っています。 テーブル名 abc ( abc1_id(プライマリ) , abc2_vote_volume(INT) ) テーブル名 def ( def1_id(プライマリ) , def2_vote_volume(INT) ) があります。 テーブル名 abc にある abc2_vote_volume(INT)にはユーザーが1票づつ投票します。 abc2_vote_volume(INT)が49までのうちは何も起こらず、 abc2_vote_volume(INT)が50を超えたら「テーブル名 def 」に全てをコピーしていくトリガの作成を考えました。 私が考えたのは下記の表現なのですが、エラーとなります。 FOR AS IF UPDATE 49<NEW.adc2_vote_volume が見るからに怪しいのですが、改定方法が分かりません。 詳しい方、ご教授頂けますようお願いいたします。 DELIMITER // CREATE TRIGGER a_ref AFTER UPDATE ON abc FOR AS IF UPDATE 49<NEW.adc2_vote_volume INSERT INTO def SET def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume ON DUPLICATE KEY UPDATE def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume; END; // DELIMITER

    • ベストアンサー
    • MySQL
  • char *name1[4] とchar name2[][4] の違いについて

    C言語のことで質問があります。 char *name1[4]は char *name1[4] = {"abcdefghi","jkl","l","mn"}; と宣言でき,ポインタを4つ確保した形となりました。 char name2[][4]は char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"}; と4文字以内の文字列を初期化した数だけ確保した形となりました。 この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。 しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。 *name1[4]では4つのポインタを確保できるのに~と思ってしまいます。 ポインタと配列は別物と考えるべきなのでしょうか? 訳の分からない質問かもしれませんが, 何卒ご指導いただくようよろしくお願いします。

  • TCHAR文字列内の検索について

    TCHAR文字列内の検索について 質問があります。 #include <tchar.h> TCHAR tex1[8]; TCHAR tex2[8]; TCHAR tex3[8]; TCHAR buf[128] = TEXT("abc,def,ghi"); TCHAR型で宣言された変数bufには、「abc,def,ghi」が格納されているとして、 結果的に tex1 → "abc" tex2 → "def" tex3 → "ghi" となるようなプログラムを作ろうと考えています。(buf内をコンマで区切って3つの変数に代入) まずコンマの位置が何文字目にあるか確認するために TCHAR ret[128]; TCHAR search[128] = TEXT(","); ret = _tcschr( buf, search); としてみましたが、やはりうまくいかずにエラーが出ます。 上記の目的を達成するにはどのようなプログラムを作ればよいのでしょうか? 環境はVisual C++ 2008 Expressで、C言語を使ってプログラミングしています。

このQ&Aのポイント
  • EP-803Aのインクカートリッジが認識されずエラーメッセージが表示される場合、古い型番のカートリッジでは使用できない可能性があります。
  • EP-803Aでインクカートリッジが認識されない問題の解決方法について、情報をお持ちの方がいらっしゃれば教えてください。
  • EP-803Aのインクカートリッジ認識エラーに関する対処法をご存知の方は、アドバイスをお願いします。
回答を見る