Jump to content

Ajudas Classes


andreb
 Share

Recommended Posts

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.

...

Link to comment
Share on other 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# 😄 Tens que utilizar ifs com strcmp.

Desaparecido.

Link to comment
Share on other 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..

...

Link to comment
Share on other 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.

Desaparecido.

Link to comment
Share on other 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.

Desaparecido.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.