Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: [XCode] Trying to use C++11 features  (Read 3469 times)

0 Members and 1 Guest are viewing this topic.

Duke0200

  • Newbie
  • *
  • Posts: 5
    • View Profile
[XCode] Trying to use C++11 features
« on: May 28, 2016, 07:54:17 pm »
Basically my code is like this -
MyObject MyObject::Object(thingThatGoesIntoObject)
Which is a C++11 feature.

I am using XCode and everytime I build it, I get 3 errors, one being the cause which I know is that my compiler isn't setup to be C++11. I've tried to change the compiler to libc++ (the LLVM version) as well as the stdlibc++. I've also tried changing the C++ Dialect to C++11 and GNU++11 but nothing has been working. In the Build Options menu, my Compiler for the C-languages (C/C++/Obj-C) is Apple LLVM 6.1. I'm pretty sure I'm using XCode 6.4 apparently. Do I need to revert to a lower XCode version (I've been seeing XCode version 4.x and 5.x being used) or do I need to change the compiler information?

Thanks for the help.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Posts: 32498
    • View Profile
    • SFML's website
    • Email
Re: [XCode] Trying to use C++11 features
« Reply #1 on: May 28, 2016, 08:07:05 pm »
Quote
Which is a C++11 feature.
??
I just see the prototype of a regular member function. Nothing C++11 here.

Quote
I get 3 errors
Would be useful to see them.
Laurent Gomila - SFML developer

Duke0200

  • Newbie
  • *
  • Posts: 5
    • View Profile
Re: [XCode] Trying to use C++11 features
« Reply #2 on: May 28, 2016, 08:12:34 pm »
I get a semantic error in a file called memory. It says

"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:1645:31: No matching constructor for initialization of 'Tile'"

Then the other two which I think are caused by it are one in the Linker

 "clang: error: linker command failed with exit code 1 (use -v to see invocation)"

and an error in the file lipo
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't open input file: /Users/trystan/Library/Developer/Xcode/DerivedData/TESTING-avrlnzthtflfbdcaogumbsfcstwk/Build/Intermediates/TESTING.build/Debug/TESTING.build/Objects-normal/i386/TESTING (No such file or directory)"

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Posts: 4321
    • View Profile
    • Email
Re: [XCode] Trying to use C++11 features
« Reply #3 on: May 28, 2016, 08:14:25 pm »
Start by fixing your `Tile` class, the other errors are most certainly simply a consequence.
SFML / OS X developer

Duke0200

  • Newbie
  • *
  • Posts: 5
    • View Profile
Re: [XCode] Trying to use C++11 features
« Reply #4 on: May 28, 2016, 08:22:20 pm »
Thing is - my Tile constructor matches up with the variables that I'm trying to make.

Here's the code for the constructors and variables

//Tile.h

#include <SFML/Graphics.hpp>
#include <string>

using namespace sf;

class Tile {
   
private:
    Tile(sf::Color c, bool moveIn, std::string n);
   
public:
   
    sf::Color color;
    bool canMoveIn;
    std::string name;
   
    const static Tile FLOOR, WALL, VOID;
};

 

//Tile.cpp

#include "Tile.h"

Tile::Tile(sf::Color c, bool moveIn, std::string n) : color(c), name(n) {
    canMoveIn = moveIn;
}

const Tile Tile::FLOOR(sf::Color(0, 126, 0), true, "floor");
const Tile Tile::WALL(sf::Color(126, 126, 126), false, "wall");
const Tile Tile::VOID(sf::Color(0,0,0), false, "void");
 

I'm sorry for turning this into a "Fix my Code" Situation I just have no idea how to fix this since, in my eyes, it's correct, or at least should be.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Posts: 32498
    • View Profile
    • SFML's website
    • Email
Re: [XCode] Trying to use C++11 features
« Reply #5 on: May 28, 2016, 09:03:25 pm »
Can you show the code that creates the Tile instances? I guess you're defining an array (raw or std::array) of them, and since there's no default constructor the compiler complains.
Laurent Gomila - SFML developer

Duke0200

  • Newbie
  • *
  • Posts: 5
    • View Profile
Re: [XCode] Trying to use C++11 features
« Reply #6 on: May 28, 2016, 09:15:14 pm »
I use std::vector<std::vector<Tile>> to store the instances. Here's the code for the Dungeon constructor which stores the tiles

//Dungeon.cpp

Dungeon::Dungeon(int width, int height) : width(width/Tile::TILE_SIZE), height(height/Tile::TILE_SIZE), tiles(this->height) {
    for (int y = 0; y < this->height; y++) {
        tiles.push_back(vector<Tile>(this->width));
    }
    for (int x = 0; x < this->width; x++) {
        for (int y = 0; y < this->height; y++) {
            tiles[x][y] = rand() % 10 < 5 ? Tile::FLOOR : Tile::WALL;
        }
    }
}
 

Then the Dungeon.h file with the things that I think you want.

//Dungeon.h

class Dungeon {
private:
    //! Storage for tiles.
    std::vector<std::vector<Tile>> tiles;
   
    //! width of dungeon
    int width,
    //! height of dungeon
    height;
   
public:
    /**
     Creates a dungeon.
     
     @param width width that is divided by Tile TILE_SIZE
     @param height height that is divided by Tile TILE_SIZE
     */

     // TILE_SIZE is a static const defined in Tile.h that equals 8 at the moment
    Dungeon(int width, int height);
 

I also made a default constructor for Tile, but when I built it, it still failed. The default constructor for Tile is essentially Tile::VOID. Tile(sf::Color(0,0,0), false, "void")

Thank you for your help.
« Last Edit: May 28, 2016, 09:18:02 pm by Duke0200 »

Duke0200

  • Newbie
  • *
  • Posts: 5
    • View Profile
Re: [XCode] Trying to use C++11 features
« Reply #7 on: May 28, 2016, 09:35:48 pm »
Actually I just got everything to work. Essentially what I did was make the Tiles const pointers

//Tile.cpp

Tile::Tile() : color(*new sf::Color(0,0,0)), canMoveIn(false), name("void") {}

Tile::Tile(sf::Color c, bool moveIn, std::string n) : color(c), name(n) {
    this->canMoveIn = moveIn;
}

const Tile *Tile::FLOOR = new Tile::Tile(sf::Color(0, 126, 0), true, "floor");
const Tile *Tile::WALL = new Tile::Tile(sf::Color(126, 126, 126), false, "wall");
const Tile *Tile::VOID = new Tile::Tile();
 

Made some functions constant, made the tiles 2d vector in dungeon store const Tile *, and change their functions to go with it.
//Dungeon.cpp
Dungeon::Dungeon(int width, int height) : width(width/Tile::TILE_SIZE), height(height/Tile::TILE_SIZE), tiles(this->height) {
    //I had a BAD_ACCESS error or something here so I did the following line of code.
    tiles = vector<vector<const Tile *>>(this->height);
    for (int y = 0; y < this->height; y++) {
        tiles.push_back(vector<const Tile *>(this->width));
        for(int x = 0; x < this->width; x++) {
            tiles[y].push_back(Tile::VOID);
        }
    }
    for (int x = 0; x < this->width; x++) {
        for (int y = 0; y < this->height; y++) {
            tiles[y][x] = rand() % 10 < 5 ? Tile::FLOOR : Tile::WALL;
        }
    }
}

const Tile * Dungeon::tile(int x, int y ) {
    if (x < 0 || x >= width || y < 0 || y >= height) {
        return Tile::VOID;
    }
    return tiles[y][x];
}

 

So I suppose thank you guys
« Last Edit: May 28, 2016, 09:41:20 pm by Duke0200 »