• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

andreb

Ajudas Classes

8 mensagens neste tópico

Boas,

eu decidi encerrar o meu projecto de FTP e de Sockets e aprender mais um pouco sobre classes... estou a criar uma class para depois poder criar programas com varias línguas.. mas o pouco código que tenho está cheio de erros e não sei como corrigilos... estou aqui a meia hora mudar const char's para char's, char's para const char's e não acerto com isto.. será que alguém me pode ajudar a corrigir o código?

CODIGO:

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

namespace AB{
    class Lang {
        int x;
        const char* lang_pt[0x100]="array";
        const char* lang_en[0x100]="array";
        const char* lang_default="pt";
      public:
        void setdefault(const char* lang){
             lang_default=lang;
        }
	void set(int a,const char* string,const char* lang){
             if(lang==NULL){
                            lang=lang_default;
                            }
             switch(lang){
                          case "pt": lang_pt[a]=string; break;
                          case "en": lang_en[a]=string; break;
             }
        };
    };
    Lang Lang;
}

ERROS com o VS C++ 2008:

(9) : error C2864: 'AB::Lang::lang_pt' : only static const integral data members can be initialized within a class

(10) : error C2864: 'AB::Lang::lang_en' : only static const integral data members can be initialized within a class

(11) : error C2864: 'AB::Lang::lang_default' : only static const integral data members can be initialized within a class

(20) : error C2450: switch expression of type 'const char *' is illegal

(21) : error C2051: case expression not constant

(22) : error C2051: case expression not constant

(23) : warning C4060: switch statement contains no 'case' or 'default' labels

Cumps andreb.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que tens de definir as variáveis lang_pt, lang_en e lang_default como static.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já tinha experimentado por static e mesmo assim continua a dar erro. Quanto ao switch penso que depois de conseguir resolver essas acima dá para resolve-lo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora aqui está algo de C++ sobre o qual nunca tinha pensado: campos const. Nada que o meu amigo Google não pudesse resolver :)

Como está descrito nos erros, o único tipo de variáveis que podes inicializar na declaração de uma classe são tipos inteiros (int, short int, char, etc) estáticos e constantes. O que estás a tentar afectar são arrays de apontadores para char, e aí tens outro problema: estás a tentar afectá-los com arrays de char. Quando muito, poderias fazer const char lang_en[0x100]="array";, ou ainda const char* lang_en="array";, o que também não iria funcionar porque são arrays de um tipo inteiro, e não um tipo inteiro.

A única maneira de inicializares membros const de uma classe é na lista de inicialização do construtor da classe, e aqui aqui cria-se outro problema com a inicialização de arrays: não podem ser inicializados em listas de inicialização. A única solução que te resta é teres apontadores para char, e inicializá-los na lista de inicialização da seguinte forma:

        const char *lang_pt;
        const char *lang_en;
        char *lang_default;
(...)
Lang(): lang_pt("array"), lang_en("array"), lang_pt("pt")
{}

Quanto ao switch... não podes utilizar uma string como expressão, isso é à C# :D Tens que utilizar ifs com strcmp.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obg já esta tudo a funcionar menos o sprintf(lang_pt[a],"%s",string); que foi agora substitui o lang_pt[a]=string; que dava este erro penso por estar a tentar modificar consts mas agora com esse sprintf já não da o mesmo erro porque diz

error C2664: 'sprintf' : cannot convert parameter 1 from 'const char' to 'char *'
, mas as variáveis estão as duas declaradas como: const char*.

isto tudo surgio por causa disto, em que eu o usei num programazinho meu em C e deu o seguinte resultado:

	//Ficheiro formatado por STRING_CATCHER V 1.0
	//By: www.FABIOFASANTOS.tk
	//Em: Sabado 24 de Maio de 2008 ---- 11:49:44
	//Ficheiro original: main.c

const char* STRING_CATCHER[21] = {
   "links.txt",
   "r",
   "links.txt",
   "w",
   "links.txt",
   "r",
   "COLOR F",
   "links.txt",
   "r",
   "\nEscolha: ",
   "%d",
   "start %s",
   "start %s",
   "start %s",
   "start %s",
   "start %s",
   "start %s",
   "start %s",
   "start %s",
   "start %s",
   "start %s"
   };




#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE * fptest;
  fptest=fopen(STRING_CATCHER[0],STRING_CATCHER[1]);
  if(fptest==NULL){ fptest=fopen(STRING_CATCHER[2],TRING_CATCHER[3]); }
  int escolha;
  char l1[1000];
  char l2[1000];
  char l3[1000];
  char l4[1000];
  char l5[1000];
  char l6[1000];
  char l7[1000];
  char l8[1000];
  char l9[1000];
  char l10[1000];
  char l11[1000];
  char l12[1000];
  char l13[1000];
  char l14[1000];
  char l15[1000];
  char l16[1000];
  char l17[1000];
  char l18[1000];
  char l19[1000];
  char l20[1000];
  char str[1000];
  FILE *fp;
  fp=fopen(STRING_CATCHER[4],STRING_CATCHER[5]);
  int ch, lines=0;
  while((ch = fgetc(fp)) != EOF )
         {
            if ( ch == '\n' )
            {
               ++lines;
            }
            }
  lines=lines+1;
  fclose(fp);
if(lines>1){ system(STRING_CATCHER[6]);
             fp=fopen(STRING_CATCHER[7],/STRING_CATCHER[8]);
             fgets(l1,1000,fp);
             fgets(l2,1000,fp);
             printf(l1);
             }
if(lines>3){ fgets(l3,1000,fp);
             fgets(l4,1000,fp);
             printf(l3);   
             }
if(lines>5){ fgets(l5,1000,fp);
             fgets(l6,1000,fp);
             printf(l5);
             }
if(lines>7){ fgets(l7,1000,fp);
             fgets(l8,1000,fp);
             printf(l7);
             }
if(lines>9){ fgets(l9,1000,fp);
             fgets(l10,1000,fp);
             printf(l9);
             }
if(lines>11){ fgets(l11,1000,fp);
              fgets(l12,1000,fp);
              printf(l11);
              }
if(lines>13){ fgets(l13,1000,fp);
              fgets(l14,1000,fp);
              printf(l13);
              }
if(lines>15){ fgets(l15,1000,fp);
              fgets(l16,1000,fp);
              printf(l15);
              }
if(lines>17){ fgets(l17,1000,fp);
              fgets(l18,1000,fp);
              printf(l17);
              }
if(lines>19){ fgets(l19,1000,fp);
              fgets(l20,1000,fp);
              printf(l19);
              }
  printf(STRING_CATCHER[9]);
  scanf(TRING_CATCHER[10],&escolha);  
  switch(escolha) { case 1: sprintf(str,STRING_CATCHER[11],l2); break;
                    case 2: sprintf(str,STRING_CATCHER[12],l4); break;
                    case 3: sprintf(str,STRING_CATCHER[13],l6); break;
                    case 4: sprintf(str,STRING_CATCHER[14],l8); break;
                    case 5: sprintf(str,STRING_CATCHER[15],l10); break;
                    case 6: sprintf(str,STRING_CATCHER[16],l12); break;
                    case 7: sprintf(str,STRING_CATCHER[17],l14); break;
                    case 8: sprintf(str,STRING_CATCHER[18],l16); break;
                    case 9: sprintf(str,STRING_CATCHER[19],l18); break;
                    case 10: sprintf(str,STRING_CATCHER[20],l20); break;
                  }   
  system(str);	
  return 0;
}

e eu queria criar uma coisa parecida com aquela sena do STRING_CATCHER[21] para poder ter em varias línguas o programa. não sei se já me tinha feito entender..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens que utilizar sprintf(lang_pt, "%s", string); porque lang_pt[0] traduz-se no 1º caracter da string. E tens que ter a certeza que tens espaço suficiente alocado em lang_pt antes de utilizar o sprintf.

Já agora, porque não utilizas o strcpy em vez do sprintf? Com essa formatação, fazia mais sentido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas assim não vai dar para por apenas uma frase em lang_pt??? tipo eu queria como o string catcher em que STRING_CATCHER[19] por exemplo se traduz numa string...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então a tua declaração inicial de char* lang_pt[0x100] estava correcta. Tens é que tirar o const, ou arranjar uma maneira (que eu não conheço, nem sei se é possível) de inicializar os arrays. De qualquer maneira, não podes inicializá-los como fizeste no 1º post, porque "array" é um array de chars, e não um array de apontadores para char.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora