GVKun编程网logo

(SFML)继承问题(C ++)(c++继承代码)

13

如果您想了解和SFML继承问题的知识,那么本篇文章将是您的不二之选。我们将深入剖析的各个方面,并为您解答SFML继承问题的疑在这篇文章中,我们将为您介绍的相关知识,同时也会详细的解释SFML继承问题的

如果您想了解SFML继承问题的知识,那么本篇文章将是您的不二之选。我们将深入剖析的各个方面,并为您解答SFML继承问题的疑在这篇文章中,我们将为您介绍的相关知识,同时也会详细的解释SFML继承问题的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

(SFML)继承问题(C ++)(c++继承代码)

(SFML)继承问题(C ++)(c++继承代码)

好吧,在咨询了SFML论坛之后,我将代码重构为以下代码:

Sprite.h:

#include "AssetManager.h"

class Sprite{
public:
    sf::Sprite m_sprite;

    sf::Vector2f sprite_scale;
    sf::Vector2u original_size;
    sf::Vector2f texture_size;

    Sprite(){}
    sf::Sprite set_sprite(sf::Texture& tx,sf::IntRect rect,sf::Vector2f size);
};

Sprite.cpp:

#include "Sprite.h"

sf::Sprite Sprite::set_sprite(sf::Texture& tx,sf::Vector2f size) {

    sf::Sprite spr(tx);

    spr.setTextureRect(rect);

    original_size =tx.getSize();

    texture_size.x = static_cast<float>(original_size.x);
    texture_size.y = static_cast<float>(original_size.y);

    sprite_scale.x = size.x / texture_size.x;
    sprite_scale.y = size.y / texture_size.y;

    spr.setScale(sf::Vector2f(sprite_scale.x,sprite_scale.y));
    spr.setOrigin(sf::Vector2f(original_size.x / 2,original_size.y / 2));

    return spr;
}

Entity.h:

#pragma once
#include "Sprite.h"
#include "collision.h"
#include "Timer.h"

class Entity {
public:
    Sprite spr;
    sf::Sprite entity_sprite;
    int health;
    float max_speed;
    sf::Vector2f speed;
    sf::Vector2f direction;
    float acceleration;
    bool collision = false;
    timer t;
    float acc_time;
};

Player.h:

#pragma once
#include "Entity.h"

class Player:public Entity {
public:
    Player();
    float acc_time = t.accumulate_time();
    void keyboard_controls();
    void mouse_controls(sf::Vector2f cursor);
};

Player.cpp:

#include "Player.h"
#include <math.h>


Player::Player() {
    
    speed = { 0,0 };
    acceleration = 2;
    max_speed = 500 + acceleration;
    entity_sprite = spr.set_sprite(AssetManager::LoadTexture("res/wildcard.png"),{ 0,60,63 },{ 60,63 });
}

简而言之,Sprite类的构造函数被具有完全相同作用的方法所取代,这样我就可以简单地在Sprite内声明一个没有参数的Entity对象类,并且派生的Player类不会有任何问题,因为不会要求我为Sprite和Entity类创建默认构造函数。

Android App启动错误的问题(connection to the server was unsuccessful)

Android App启动错误的问题(connection to the server was unsuccessful)

问题描述:

PhoneGap+Sencha Touch开发的应用,打包后的APP或者调试期间,在启动的时候提示如下信息:
Application Error - The connection to the server was unsuccessful. 
(file:///android_asset/www/index.html) 
 
问题分析:
这个应该是PhoneGap某些版本的BUG,尤其在index.html加载的内容较多时容易出现。
 
解决方法:
方法1:更新到PhoneGap的最新版本;
方法2:设置加载超时属性
super.setIntegerProperty("loadUrlTimeoutValue",10000);  

完整代码如下(设置超时为 10 秒)

@Override
publicvoid onCreate(Bundle savedInstanceState){
   
super.onCreate(savedInstanceState);
   
super.loadUrl("file:///android_asset/www/home/index.html");
   
super.setIntegerProperty("loadUrlTimeoutValue",10000);

方法3:改名法
把index.html更名为main.html,然后新建一个index.html页面,内容如下:
tittle
 
主要原理就是通过一个过渡页面,把加载首页的内容最小化。
 
添加到配置中 
 

c# – 新手继承问题

c# – 新手继承问题

我不明白为什么我的输出不是我认为应该的.我认为应该是狗吠线断线猫咪.但没有什么.

码:

namespace ConsoleApplication2
{
  class Program
  {
    static void Main(string[] args)
    {
      Pets pet1 = new Dog();
      Pets pet2 = new Cat();
      pet1.Say();
      pet2.Say();
      Console.ReadKey();
    }
  }

  class Pets
  {
   public void Say() { }
  }

  class Dog : Pets
  {
   new public void Say() { Console.WriteLine("Dog barks."); }
  }

  class Cat : Pets 
  {
   new public void Say() { Console.WriteLine("Cat meows."); }
  }
}

我试图通过c# programming guide on MSDN,但是我觉得很难理解那里的一些例子.如果有人可以链接到一个很好的“假人遗产”网站,那将是非常感激的.

解决方法

将您的基类中的Say功能虚拟化,然后在派生类中覆盖此函数:
namespace ConsoleApplication2
{
  class Program
  {
    static void Main(string[] args)
    {
      Pets pet1 = new Dog();
      Pets pet2 = new Cat();
      pet1.Say();
      pet2.Say();
      Console.ReadKey();
    }
  }

  class Pets
  {
   public virtual void Say() {
      Console.WriteLine("Pet makes generic noise");
 }
  }

  class Dog : Pets
  {
    public override void Say() { Console.WriteLine("Dog barks."); }
  }

  class Cat : Pets 
  {
    public override void Say() { Console.WriteLine("Cat meows."); }
  }
}

C#泛型继承问题

C#泛型继承问题

我想添加不同类型的对象,这些对象派生自具有泛型的一个类到基类型列表.我得到这个编译错误
Error   2   Argument 1: cannot convert from 'ConsoleApplication1.Stable' to 'ConsoleApplication1.ShelterBase<ConsoleApplication1.AnimalBase>'   C:\Users\ysn\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs 43  26  ConsoleApplication1

我看不到这个问题,你能为我提供另一种做这种事情的方法吗?

abstract class AnimalBase { public int SomeCommonProperty;}

abstract class ShelterBase<T> where T : AnimalBase
{
    public abstract List<T> GetAnimals();
    public abstract void FeedAnimals(List<T> animals);
}


class Horse : AnimalBase { }

class Stable : ShelterBase<Horse>
{
    public override List<Horse> GetAnimals()
    {
        return new List<Horse>();
    }

    public override void FeedAnimals(List<Horse> animals)
    {
        // Feed them
    }
}


class Duck : AnimalBase { }

class HenHouse : ShelterBase<Duck>
{
    public override List<Duck> GetAnimals()
    {
        return new List<Duck>();
    }

    public override void FeedAnimals(List<Duck> animals)
    {
        // Feed them
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<ShelterBase<AnimalBase>> shelters = new List<ShelterBase<AnimalBase>>();

        ///////////////////////////// following two lines do not compile
        shelters.Add(new Stable()); 
        shelters.Add(new HenHouse());
        /////////////////////////////

        foreach (var shelter in shelters)
        {
            var animals = shelter.GetAnimals();
            // do sth with 'animals' collection
        }
    }
}

解决方法

您可以使用 contravariance,但只有当您将抽象类更改为接口,并将GetAnimals的返回类型更改为IEnumerable< T>,因为List< T>不支持此功能.

工作原理:

abstract class AnimalBase { public int SomeCommonProperty;}

interface IShelterBase<out T> where T : AnimalBase
{
    IEnumerable<T> GetAnimals();
}

class Horse : AnimalBase { }

class Stable : IShelterBase<Horse>
{
    public IEnumerable<Horse> GetAnimals()
    {
        return new List<Horse>();
    }
}

class Duck : AnimalBase { }

class HenHouse : IShelterBase<Duck>
{
    public IEnumerable<Duck> GetAnimals()
    {
        return new List<Duck>();
    }
}

void Main()
{
    List<IShelterBase<AnimalBase>> shelters = new List<IShelterBase<AnimalBase>>();

    shelters.Add(new Stable());
    shelters.Add(new HenHouse());

    foreach (var shelter in shelters)
    {
        var animals = shelter.GetAnimals();
        // do something with 'animals' collection
    }
}

C#继承问题

C#继承问题

我正在创建一个抽象基类,其中包含由其他类实现的函数.我的怀疑如下

1)我是否需要在每个需要被子类覆盖的函数前面给出“虚拟”?我看到一些没有虚拟关键字的示例,但仍然可以覆盖它们.

2)我需要有一个将在基类中实现的函数,我不希望它被子类重写.我添加了该功能的“固定”关键字.编译器开始抱怨“成员”无法密封,因为它不是覆盖.我在这里做错了吗?

abstract public class ShapeBase
    {
        private ShapeDetails _shapedDetails;

        public CampusCardBase(ShapeDetails shDetails)
        {
            _shapedDetails= shDetails;
        }

        public virtual void Draw();
        public virtual float getWidth();
        public virtual void Swap();
        public virtual void Erase();

        public sealed ShapeDetails getShapeDetails()
        {
            return _shapedDetails;
        }


    };

解决方法

>对于在抽象类中没有实现的方法,也使用abstract:
abstract public void Draw();
abstract public float getWidth();
abstract public void Swap();
abstract public void Erase();

>默认情况下,方法不可覆盖;如果声明为abstract,virtual或override(但不覆盖密封),它们只允许派生类重写.

因此,您不需要为getShapeDetails()提供除public之外的任何其他修饰符:

public ShapeDetails getShapeDetails()
{
    return _shapedDetails;
}

另外,您应该坚持使用.NET命名约定并使用Pascal大小写大写方法名称,因此getWidth()变为GetWidth(),getShapeDetails()变为GetShapeDetails().

实际上你应该为你的_shapedDetails字段使用property getter而不是getShapeDetails()方法:

private ShapeDetails _shapedDetails;

public ShapeDetails ShapedDetails
{
    get { return _shapedDetails; }
}

我们今天的关于SFML继承问题的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android App启动错误的问题(connection to the server was unsuccessful)、c# – 新手继承问题、C#泛型继承问题、C#继承问题的相关信息,请在本站查询。

本文标签: