←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4569

Mapの実装
投稿者---pom(2005/08/27 14:52:54)


C++の質問で恐縮ですが、

簡単なMapクラスを実装してみましが、

「error C2011: 'My_Element' : 'class' で示される型としてすでに定義されています。」

というコンパイルエラーが出ます。

ソースは、恥ずかしいですが、以下のようなものです。

どう対処したらよいか分かりません。
どなたか助言をくれませんでしょうか?

環境は
OS:Windows Home
コンパイラ:VisualC++6.0


///////////////////////////////////////////////////////////////
// Mapクラス map.h

#define SIZE 128
#define MAP_SIZE 10

class My_Map {
 private:
  My_Element e[MAP_SIZE];
  int index;

  int search_key(char *k);
    
 public:
  My_Map(void);
  void put(char* ,char*);
  char* get(char*);
};

class My_Map {
 private:
  My_Element e[MAP_SIZE];
  int index;

  int search_key(char *k);
    
 public:
  My_Map(void);
  void put(char* ,char*);
  char* get(char*);
};


My_Map::My_Map(void) {
  index=0;

}

int My_Map::search_key(char *k) {
  int i;
  
  for ( i=0; i < MAP_SIZE ; i++ ) {
    if( e[i].get(k) ) {
      return i;
    }

  }

  return -1;
}

void My_Map::put(char *k, char *v){
  if( index < MAP_SIZE ) {
    e[index++].set( k , v );
  } else {
    cerr<<"My_Map is empty !"<<endl;
  }
}

char* My_Map::get(char *k) {
  int index=-1;

  index = search_key(k);
  
  if( index != -1 ) {
    return e[index].get(k);
  }else{
    return NULL;
  }
}

///////////////////////////////////////////////////////////////////////
// Mapの要素クラス element.h

#include "string.h"

#define CHAR_SIZE 100

//using namespace std;

class My_Element {
 private:
  char key[CHAR_SIZE];
  char value[CHAR_SIZE];

 public:
  void set(char*, char*);
  char* get(char*);
};



void My_Element::set(char *k, char *v) {
  strcpy(key, k);
  strcpy(value, v);
}

char* My_Element::get(char *k) {
  // キーが同じならその値を返し、そうでないならNULLを返す
  return !strcmp(k, key) ? value : NULL;  
}

////////////////////////////////////////////////////

// テストドライバ
#include<iostream>

#include "map.h"
#include "element.h"

using namespace std;

int main(void)
{
  My_Map map;

  map.put( "tanaka", "taro" );
  map.put( "yamada", "hanako" );

  cout<< map.get( "yamada" ) << endl;
  
  
  return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:Mapの実装 4570 とおり 2005/08/27 15:49:16
<子記事> Re:Mapの実装 4571 επιστημη 2005/08/28 01:21:11


No.4570

Re:Mapの実装
投稿者---とおり(2005/08/27 15:49:16)


とりあえず、include関係が変な気がしますが…

>class My_Map {
> private:
> My_Element e[MAP_SIZE];

map.hのこの時点で、My_Element型が何物かわからないはずですが、ここでエラーは
出ていませんか?

>#include "map.h"
>#include "element.h"

つまり、main側でmapとelement両方をincludeするのではなくて、mainはmap.hのみを
includeして、mapがelement.hをincludeするべきなのでは?


この投稿にコメントする

削除パスワード

No.4571

Re:Mapの実装
投稿者---επιστημη(2005/08/28 01:21:11)


// ----- element.h -----

#ifndef ELEMENT_H__
#define ELEMENT_H__

class My_Element {
private:
  static const int CHAR_SIZE = 100; 
  char key[CHAR_SIZE];
  char value[CHAR_SIZE];

 public:
  void set(const char*, const char*);
  const char* get(const char*) const;
};

#endif


// -----element.cpp -----

#include <cstring>
#include "element.h"

void My_Element::set(const char *k, const char *v) {
  std::strcpy(key, k);
  std::strcpy(value, v);
}

const char* My_Element::get(const char *k) const {
  // キーが同じならその値を返し、そうでないならNULLを返す

  return !std::strcmp(k, key) ? value : NULL;  
}


// ----- map.h -----

#ifndef MAP_H__
#define MAP_H__

#include "element.h"

class My_Map {
private:
  static const int MAP_SIZE = 10;
  My_Element e[MAP_SIZE];
  int index;

  int search_key(const char *k) const;
    
 public:
  My_Map(void);
  void put(const char*, const char*);
  const char* get(const char*) const;
};

#endif


// ----- map.cpp -----

#include <iostream>
#include "map.h"

My_Map::My_Map() : index(0) {}

int My_Map::search_key(const char *k) const {
  for (int i=0; i < MAP_SIZE ; i++ ) {
    if( e[i].get(k) ) {
      return i;
    }
  }
  return -1;
}

void My_Map::put(const char *k, const char *v){
  if( index < MAP_SIZE ) {
    e[index++].set( k , v );
  } else {
    std::cerr << "My_Map is full !" << std::endl;
  }
}

const char* My_Map::get(const char *k) const {
  int found = search_key(k);
  return ( found != -1 ) : e[found].get(k) : NULL;
}


// ----- main.cpp -----

#include<iostream>
#include "map.h"

int main() {
  My_Map map;
  map.put( "tanaka", "taro" );
  map.put( "yamada", "hanako" );
  std::cout << map.get( "yamada" ) << std::endl;
  return 0;
}

…ま、こんなもんでしょか。



この投稿にコメントする

削除パスワード

No.4621

Re:Mapの実装
投稿者---pom(2005/09/06 16:33:49)


返事が遅れてすいません。


とおり様のご指摘どおり

「map.h 内で element.h をinclude する」

「main側で map.h をinclude する」

で解決できました。

分割コンパイルに慣れていないので、混乱していました。

επιστημη 様にもより高度なものを提示していただき、大変参考になります。

#ifndef あたりもよく勉強してみようと思います。

ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity