Comment créer une instance d'une structure en C ++?
La question est un "violation d'Accès de l'écriture de l'emplacement 0x00000000" message d'erreur juste après que j'ai initialiser le bk
variable NULL
. Je suppose que je devrais réserver de la mémoire de l'espace à l'avance pour attribuer NULL
( quelque chose comme Book bk = new Book();
) mais je n'ai pas été en mesure de comprendre comment le faire en C++ jusqu'à maintenant.
Livre.h
#ifndef Book_H
#define Book_H
struct _book;
typedef _book* Book;
Book CreateBook(unsigned int pageNum);
Book.cpp
#include "Book.h"
#include <iostream>
#ifndef Book_CPP
#define Book_CPP
using namespace std;
struct _book
{
int pageNum;
};
Book CreateBook( unsigned int pageNum){
Book bk = NULL;
bk->pageNum = pageNum;
return bk;
};
source d'informationauteur G21
Vous devez vous connecter pour publier un commentaire.
Vous assignez bk NULL, puis en essayant d'accéder à un membre de. C'est la même chose qu'un pointeur null en Java, et ce que vous faites généralement soulever une exception NullPointerException (merci de la part de commentaires). Si vous voulez créer un pointeur de votre structure, vous devez utiliser l'opérateur new:
et puis assurez-vous d'appeler delete sur le pointeur lorsque vous avez terminé avec elle.
Je vous déconseillons d'utiliser des pointeurs ici, cependant. Contrairement à d'autres langages, le C++ permet de créer des objets en valeur. Il permet aussi pour les références et les pointeurs, mais seulement d'utiliser des pointeurs que vous devez absolument. Si vous voulez simplement créer un livre-objet avec une pageNum, vous devez créer un constructeur pendant que vous y êtes:
et puis vous pouvez l'appeler comme
Si vous êtes novice en C++, veuillez vous procurer un bon livre sur elle. Ce n'est pas seulement un langage de bas niveau, et il n'est également pas juste un langage de programmation orientée objet. C'est un multi-paradigme couteau de l'armée suisse de langue.
C'est ce que vous avez besoin de:
votre bk était nul et vous ne pouvez pas accéder pageNum lorsque le pointeur est null.
Et n'oubliez pas d'appeler delete sur bk lorsque vous avez terminé de l'utiliser.
Livre.h
Book.cpp
C'est la solution la plus simple. Les livres sont des valeurs réelles, et peuvent être copiés et déplacés autour de et la comme.
Si vous besoin de l'opacité d'un type abstrait, alors seulement vous devez traiter avec des pointeurs. Lorsque vous faites affaire avec des pointeurs, se cachant derrière un
typedef
est une mauvaise idée: les pointeurs dire de la gestion des ressources, de sorte qu'il devrait être évident que vous êtes en utilisant.Le pointeur de la version:
* Book.cpp *
mais, si vous êtes à la création des choses, vous devriez probablement créer des pointeurs intelligents:
Dans
Book bk;
bk
est un pointeurAllouer de la mémoire pour cela tout d'abord
Book bk* = new _book();
Et puis ne
bk->pageNum = pageNum;
Aussi, ne pas oublier de libérer la mémoire à l'aide de
delete bk;
Pourquoi faites-vous le typedefing? Il peut être bien pratique dans certains cas, pour certaines raisons, je suppose.
Dans le cas où vous ne saviez pas, vous pouvez également écrire simplement:
_book livre;
Maintenant livre est allouée de manière statique sur la pile au lieu de manière dynamique dans le tas. Il va se détruit automatiquement lorsque la variable est hors de portée comme int ou double, etc...
C'est utile parfois, si vous voulez éviter la surcharge de travail ou de l'allocation de mémoire pour quelque chose de vraiment simple. C'était bizarre pour moi d'aller en Java et ont à dire,
vec3 position = new Vec3(0.0, 1.0, 5.0);
au lieu de dire
vec3 position(0.0, 1.0, 5.0);
comme en C++.
ou
Il y a quelques erreurs dans votre code.
#endif
à la fin de votre fichier d'en-tête.struct
class
etunion
définitions (après l'accolade fermante).Exemple:
Livre.h
Book.cpp
Vous n'avez pas besoin de la
CreateBook
fonction de toute façon, mais je l'ai laissé dans de toute façon.