「夫を成功」へ導く妻の秘訣 座談会

STL vectorの初期化についてなんですが
以下のようなクラスのprivateなメンバ変数としてvectorを定義し
それをメソッド内のループ処理にて初期化しながら使用したいのですが
初期化の仕方が分かりません。コンストラクタを呼べば初期化されるようですが
以下のようにヘッダとソース内で2度同じような宣言をしてしまっても問題ないのでしょうか?

//=== test.h ===
class test {
private :
vector<int> array;
public :
int fnc();
};

//=== test.c ===
int fnc()
{
for (int i = 0; i < 10; i++)
{
//★ここで初期化したい
vector<int> array;  ←これで問題ないか?
for (int j = 0; j < 10; j++)
{
array.push_back( md );
}
}
}

C#などでは宣言とインスタンス生成を別に分けられたのですがC++も同様の事が出来るのでしょうか?
一応「array = new vector<int>;」といれて見たのですがエラーが出ました。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

C++では、クラスのデータメンバはコンストラクタ初期化子でしか初期化することができません。


他の場所では、更新することはできても初期化することはできません。

何らかの理由で"再"初期化をしたいのであれば、次のようにしてください。
(これも一種の更新です)

vector<int> temp(初期化に必要な引数並び);
this->array.swap(temp);
    • good
    • 0

回答は既にあるとおりですが、



> それをメソッド内のループ処理にて初期化しながら使用したいのですが

もしも、int func() の中「だけ」で使うのなら、そもそも、array をメンバ変数にしてはいけませんということになります。

あと、C++ の new は、ポインタを返しますから、

std::vector<int> *arrya;

なら、

array = new (std::vector<int>);

で大丈夫です。
ただ、これは、「初期化」ではなく「生成」ですから、func() で生成したら、多くの場合は、func で破棄することになります。
    • good
    • 0

vector<int> array;  ←これで問題ないか?


問題あります。と言うかC#でもローカル変数になるのでダメだと思いますが。

C#の配列とクラスで実装されているvectorではだいぶ違いますので注意して下さい。
こうすれば初期化できます。
なぜtestのコンストラクで値を入れないかは疑問ですが。

//=== test.h ===
class test {
private :
vector<int> array;
public :
int fnc();
};

//=== test.c ===
int test::fnc()
{
for (int i = 0; i < 10; i++)
{
//★ここで初期化したい
for (int j = 0; j < 10; j++)
{
array.push_back( md );
}
}
}
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC++ vectorに配列をプッシュしたい

C++のstd::vectorが格納する要素として配列を指定することはできますか

vectorを使って2次元配列を表現したいときは,たとえば

std::vecor<std::vector<int>> v;

とすれば2次元配列が表現できますよね.

2次元配列の列方向の要素数が2で固定されていて,行方向の要素数が不確定のデータを扱いたいので,2次元配列を格納するvectorで扱えればなと思いました.
(2個で1組のデータがたくさんあるということなので,vectorの2次元配列ではありません)

std::vector<int[2]> v;

int a[2];
a[1] = 1;
a[0] = 2;
v.push_back(a);

という書き方ではコンパイルできなかったのですが,vectorに配列要素を格納させることはできないのでしょうか.
あるいは,もし可能ならどのように書けばよいのでしょうか.

結局は1組のデータセットを構造体化してそれをvectorにプッシュするやり方に落ち着いたのですが,疑問に思ったままモヤモヤしているので質問させて頂きます.

「vector 配列」などのキーワードで検索してみましたが,vectorの動的配列としての紹介記事が多くヒットしてしまい,自分ではうまく情報を発見することはできませんでした.
よろしくお願いします.

C++のstd::vectorが格納する要素として配列を指定することはできますか

vectorを使って2次元配列を表現したいときは,たとえば

std::vecor<std::vector<int>> v;

とすれば2次元配列が表現できますよね.

2次元配列の列方向の要素数が2で固定されていて,行方向の要素数が不確定のデータを扱いたいので,2次元配列を格納するvectorで扱えればなと思いました.
(2個で1組のデータがたくさんあるということなので,vectorの2次元配列ではありません)

std::vector<int[2]> v;

int a[2];
a[1] = 1;
a[0] = 2;
v...続きを読む

Aベストアンサー

コンテナに巣の配列を要素として入れることはできません.

C++11 (以降) なら std::array を使えばいい.

C++98 なら
・あきらめる
・Boost の boost::array を使う
・C++11 の std::array 相当のものを自作する
のいずれか, かな.

QSTLのvectorで作った配列をメンバ変数にする場合は。。。

C++初心者です。

STLのvectorで作った配列をメンバ変数は
以下のように宣言し、

class Array
{
public:
vector<int> array;
void Set();
}

Array::Setのメンバ関数でarrayに値をセットします。


そして、メインからarrayを参照しようとしましたが
値が入っていませんでした。

メンバ変数の宣言の仕方が良くないのですか?

Aベストアンサー

まず、「エラーになりました」というのは、
相手に状況が全く伝わらないため、コンピュータ系の相談では避けましょう。

代わりに、
「コンパイルが通らない」(+エラーログ添付)とか
「リンクで落ちる」(+エラーログ添付)とか、
「実行時にアクセス違反が起こる」、とか表現してみたらどうでしょうか。

----------------------------------------

肝心の回答ですが、
Array::Set(void)内でアクセスしているarray[0]が
存在しません。
存在しない要素にはアクセスできませんね。
(operator[]は問答無用、at()であれば例外をキャッチできます)

ベタですが、↓これを追加すればとりあえず走りますよ。
vector<int> hoge; array.push_back(hoge);

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

Q構造体の初期化方法について

こんばんわ。
何度も申し訳ありません。

VC++.NET 2003を用いてコンソールプログラミングを行っています。前回この掲示板を利用して複数回実行するプログラムを作成し、そこに構造体を用いたプログラムを作成しました。以下に概要を示します。

グローバルで構造体を宣言しているため、複数回実行を行うプログラムでは前回の値が格納されたままであると思い、毎回実行時に構造体の初期化を行いたいと思っています。

そこで、以下に示します構造体の初期化はどのように記述すればよいのでしょうか?0で初期化したいと思っています。

よろしくお願い致します。

#define MAX 2000
//グローバル
struct tag{
int Npkt;
int gettime;
int rPkt;
int lossPkt;
}rdata[MAX];

main(){
  //for文で複数回実行処理
  for(i=0;i<=5;i++){
  //ここで構造体の初期化を記述する
//例として、5回プログラムを実行する
  }
}

こんばんわ。
何度も申し訳ありません。

VC++.NET 2003を用いてコンソールプログラミングを行っています。前回この掲示板を利用して複数回実行するプログラムを作成し、そこに構造体を用いたプログラムを作成しました。以下に概要を示します。

グローバルで構造体を宣言しているため、複数回実行を行うプログラムでは前回の値が格納されたままであると思い、毎回実行時に構造体の初期化を行いたいと思っています。

そこで、以下に示します構造体の初期化はどのように記述すればよいのでしょうか?0で初...続きを読む

Aベストアンサー

★まとめ
・既に『memset』関数や、『ZeroMemory』関数の回答があるので構造体の全体、1部の
 初期化の記述例を紹介します。
・それと『#include <memory.h>』を記述しないとメモリ関係の関数が利用できません。
 『ZeroMemory』関数の場合は『#include <windows.h>』があればそのまま利用できます。

●構造体全体を初期化
ZeroMemory( rdata, sizeof(rdata) ); または、
memset( rdata, 0, sizeof(rdata) ); です。

●構造体一部を初期化
ZeroMemory( &rdata[i], sizeof(struct tag) ); または、
memset( &rdata[i], 0, sizeof(struct tag) ); です。
※rdata[i]の1データだけ初期化します。

余談:
・『ZeroMemory』関数は Win32 API と分類されていますが、実体は『memset』関数に
 『#define』されているだけです。でも、戻り値を『VOID』型にキャストされているので
 『memset』関数のリターン値を取得できません。→第一引数のアドレスが『memset』関数
 ではリターンします。
・以上。おわり。

参考URL:http://taka.no32.tk/tips/Win32/ZeroMemory.html

★まとめ
・既に『memset』関数や、『ZeroMemory』関数の回答があるので構造体の全体、1部の
 初期化の記述例を紹介します。
・それと『#include <memory.h>』を記述しないとメモリ関係の関数が利用できません。
 『ZeroMemory』関数の場合は『#include <windows.h>』があればそのまま利用できます。

●構造体全体を初期化
ZeroMemory( rdata, sizeof(rdata) ); または、
memset( rdata, 0, sizeof(rdata) ); です。

●構造体一部を初期化
ZeroMemory( &rdata[i], sizeof(struct tag) ); または、
m...続きを読む

Q構造体のvectorを引数として関数に渡したい。(C++です)

構造体のvectorを引数として関数に渡すときの書き方がわかりません。(最終的には参照かアドレスで渡そうと思っています)

ご教授ください。

いまのところ試した書き方は、下のとおりです(どれもダメでした)

struct mm{
int a;
string b;
};
vectror<mm> mx;


関数の部分
int func(vector <mm> mx) ダメでした
int func(vector struct mm mx) ダメでした

教えてください。

Aベストアンサー

参照かアドレスで渡すのがよいと思います

// 参照渡し
int func(vector<mm>& m) { cout << m.a; }
// 使い方
func(mx);

// アドレス渡し
int func(vector<mm>* m) { cout << m->a; }
// 使い方
func(&mx);

QCStringとString

MFCプログラミングでは、CStringがよく使われていますが、Stringクラスも使用することはできますよね!?

普段使うにはどっちがいいのでしょうか?
CStringは、Stringを機能拡張したものと考えていいのでしょうか?

Aベストアンサー

ひょっとして .NET Framework の System::String のコト?

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qint型配列の一括初期化

現在、ある配列をfor()でループさせて初期化させていますが、もっと高速に初期化できる方法はないでしょうか?

//配列の初期化
int Xi[256];

for(i = 0; i < 256; i++){
   Xi[i] = 0;
}

今後、配列数を増やす予定なので高速に初期化できるものはないか探しています。
速度重視でよろしくお願いします。

Aベストアンサー

全ての要素が0で初期化された配列を確保したいのであれば、calloc()を使うというのはどうでしょうか? 上記のコードより速いという保証はありませんが。

#include <stdlib.h>
int *Xi = (int *)calloc(256, sizeof(int));

配列が不要になった時点でfree(Xi)するのをお忘れなく。また、初期値が0以外の場合にはこの手は使えません。

QVC++におけるCStringの変換

 VisualC++6.0において、CStringというオブジェクトがありますよね。
 たとえば、Edit->GetWindowText(str);
 などで、strにEditのさす文字列を入れたりして、そのあとにstrを使って算術演算をするときにどうしてもstrをintかlong型に直したいのです。
 キャストの仕方がよくわからないので、知っている方教えてください。よろしくお願いします。

Aベストアンサー

LPCSTR で中身をアクセスし、strtol() のような C の関数で処理しましょう。例えば、

CString cstr;
long l;

l = strtol((LPCSTR)cstr, NULL, 0);

この使い方だと、先に紹介されている atol() と同じですが、strtol() では、数字とみなせない
文字列を渡したときに、エラーの起きている位置を知ることができるので、真剣なプログラムには、
atol() よりは、strtol() の方が向いています。


人気Q&Aランキング